如何从两个不同的来源提取JSON数据
How to pull JSON data from two different sources?
我想知道是否有一种方法可以从两个不同的来源提取和使用JSON数据。目前,代码如下:
//JSON1
$.getJSON('url1',function(data){
$.each(data,function(key,val){
//code
});
});
//JSON2
$.getJSON('url2',function(data){
$.each(data,function(key,val){
//code
});
});
当我这样做的时候,我发现从一个JSON函数创建的变量在另一个函数中不可用,这使得它们很难一起使用。有没有更好的方法让这两个人一起工作?
此函数以url数组和回调作为参数:
function getMultiJSON(urlList,callback) {
var respList = {};
var doneCount = 0;
for(var x = 0; x < urlList.length; x++) {
(function(url){
$.getJSON(url,function(data){
respList[url] = data;
doneCount++;
if(doneCount === urlList.length) {
callback(respList);
}
});
})(urlList[x]);
}
}
你会这样使用它:
getMultiJSON(['url1','url2'],function(response) {
// in this case response would have 2 properties,
//
// response.url1 data for url1
// response.url2 data for url2
// continue logic here
});
您可能需要添加一个超时,因为如果任何URL加载失败,函数将永远不会调用您的处理程序
在使用var
(或块,使用let
)的函数中声明的变量在函数(或块)之外不可用。
$.getJSON('url1',function(data){
$.each(data,function(key,val){
var only_accessible_here = key;
});
});
因此,如果您想要在声明变量的函数范围之外可访问的变量,则需要在使用变量的函数之外声明变量。
var combined_stuff = ''
$.getJSON('url1',function(data){
$.each(data,function(key,val){
combined_stuff += val;
});
});
//JSON2
$.getJSON('url2',function(data){
$.each(data,function(key,val){
combined_stuff += val;
});
});
正如Marc B所说,如果其中一个getJSON
调用失败,则无法知道combined_stuff
变量将按哪个顺序更新,要么先按JSON1
更新,要么首先按JSON2
更新,要么只按一个顺序更新,如果两个调用都失败,则两者都不更新。
如果更新的顺序很重要,那么在要首先调用的函数的函数中,第二次调用要使用的函数。
var combined_stuff = ''
$.getJSON('url1',function(data){
$.each(data,function(key,val){
combined_stuff += val;
//JSON2
$.getJSON('url2',function(data){
$.each(data,function(key,val){
combined_stuff += val;
});
});
});
});
轻松使用开源项目jinqJs(http://www.jinqJs.com)
var data1 = jinqJs().from('http://....').select();
var data2 = jinqJs().from('http://....').select();
var result = jinqJs().from(data1, data2).select();
该示例执行同步调用,您可以通过执行以下操作执行异步调用:
var data1 = null;
jinqJs().from('http://....', function(self){ data1 = self.select(); });
结果将包含两个结果的组合。
如果您控制端点,您可以让它在一次快照中返回您想要的所有数据。然后你的数据看起来像:
{
"url1_data": url1_json_data,
"url2_data": url2_json_data
}
如果您还有两个端点需要调用,您可以将第一次ajax调用的结果传递给第二个函数(但这会使您的两次ajax调用同步):
function getJson1(){
$.getJSON('url1',function(data){
getJson2(data);
});
}
function getJson2(json1Data){
$.getJSON('url2',function(data){
//Do stuff with json1 and json2 data
});
}
getJson1();
我建议您使用jquery中可用的$.when函数来并行执行这两个方法,然后执行操作。请参阅下面剪切的代码,
var json1 = [], json2 = [];
$.when(GetJson1(), GetJson2()).always(function () {
//this code will execute only after getjson1 and getjson2 methods are run executed
if (json1.length > 0)
{
$.each(json1,function(key,val){
//code
});
}
if (json2.length > 0)
{
$.each(json2,function(key,val){
//code
});
}
});
function GetJson1()
{
return $.ajax({
url: 'url1',
type: 'GET',
dataType: 'json',
success: function (data, textStatus, xhr) {
if (data != null) {
json1 = data;
}
},
error: function (xhr, textStatus, errorThrown) {
json1 = [];//just initialize to avoid js error
}
}
function GetJson2()
{
return $.ajax({
url: 'url2',
type: 'GET',
dataType: 'json',
success: function (data, textStatus, xhr) {
if (data != null) {
json2 = data;
}
},
error: function (xhr, textStatus, errorThrown) {
json2 = [];//just initialize to avoid js error
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
每个AJAX调用返回的数据在其自己的回调函数之外不可用。我相信还有更优雅的(复杂的?)解决方案,但一些简单的、偶尔的解决方案包括全局变量,或将接收到的数据存储在隐藏的输入元素中。
在每个回调函数中,只需循环,直到出现来自另一个调用的数据:
function getJson1(){
$.getJSON('url1',function(data){
var d2 = '';
$('#hidden1').val(data);
while ( d2 == '' ){
//you should use a time delay here
d2 = $('#hidden2').val();
}
getJson2();
});
}
function getJson2(){
$.getJSON('url2',function(d2){
var d1 = '';
$('#hidden2').val(d2);
while ( d1 == '' ){
//you should use a time delay here
d1 = $('#hidden1').val();
}
//Do stuff with json1 and json2 data
});
}
getJson1();
- 如何使用另一个字符串作为模板从字符串中提取数据
- 如何使用angular js从2个表(在sql server中)中提取数据
- 从Angular 2中的observable中提取数据
- Mongoose查询在两个日期时间之间提取数据
- 可以't从xml文件中提取数据
- 从HTML代码中提取数据
- 使用JavaScript或AJAX从HTML表单中提取数据,然后将其传递给PHP
- 正在从JSON.stringify中提取数据
- Scrapy和Xpath从javascript代码中提取数据
- 如何从高股价图中提取数据
- 如何在javascript中使用localStorage从数组中存储和提取数据
- 如何从Promise中提取数据
- 为什么我的Backbone Collection没有提取数据
- 从jQuery变量中提取数据,增加's left,将剥离的数据放回变量中
- 如何使用应用程序脚本执行API从谷歌工作表中提取数据
- 使用ng repeat从两个不同的JSON文件中提取数据
- 创建新的javascript数组,从对象属性中提取数据
- 如何使用 jQuery 在没有类的情况下提取数据
- 使用javascript从JSON中提取数据
- React组件从Flux存储中呈现数据,但从Mongo数据库中提取数据时不呈现