如何从两个不同的来源提取JSON数据

How to pull JSON data from two different sources?

本文关键字:提取 数据 JSON 两个      更新时间:2023-09-26

我想知道是否有一种方法可以从两个不同的来源提取和使用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();