3

我需要进行两个不同的 ajax 调用并将两个 json 数据都传递给另一个函数。我如何使用下面的 ajax 调用格式来做到这一点?

$.ajax({ 
    url:'',
    type:'GET',
    dataType: 'json',
    success: callme
}); 

$.ajax({ 
    url:'',
    type:'GET',
    dataType: 'json',
    success: callme
});

function callme(JSON1,JSON2){
}
4

7 回答 7

6

这是$.when(假设您使用的是 jQuery)的完美用例:

var ajax1 = $.ajax({ 
    url:'',
    type:'GET',
    dataType: 'json'
});    

var ajax2 = $.ajax({ 
    url:'',
    type:'GET',
    dataType: 'json'
});

$.when(ajax1, ajax2).done(function(json1, json2) {
    // both requests succeeded    
}).fail(function(){
    // one or both requests failed
});

只有当两个请求都成功完成done时才会调用回调;如果任何请求失败,将调用回调。fail

于 2012-12-05T12:27:19.053 回答
2
 $.ajax({ 
    url:',
    type:'GET',
    dataType: 'json',
    success: callme1
 });    

  $.ajax({ 
    url:',
    type:'GET',
    dataType: 'json',
    success: callme2
 });

var JSON1;
var JSON2;

function callme1(JSON){
  JSON1 = JSON;
  if (JSON2)
    callme();
}

function callme2(JSON){
  JSON2 = JSON;
  if (JSON1)
    callme();
}

function callme() {
  // Do whatever you need with JSON1 and JSON2.
}
于 2012-12-05T12:21:57.327 回答
1

嵌套你的 ajax 调用

 $.ajax({ 
    url:',
    type:'GET',
    dataType: 'json',
    success: function(JSON1) {

      $.ajax({ 
        url:',
        type:'GET',
        dataType: 'json',
        success: function(JSON2) {
          callme(JSON1,JSON2);
        }
     });

    }
 });    


function callme(JSON1,JSON2){
}
于 2012-12-05T12:22:07.200 回答
0

您需要将函数链接在一起,以便第一个 AJAX 结果调用第二个函数,第二个 AJAX 结果调用 callme 函数:

$.ajax({ 
    url:',
    type:'GET',
    dataType: 'json',
    success: function(data) {
        $.ajax({ 
            url:',
            type:'GET',
            dataType: 'json',
            success: function(data2) {
                callme(data, data2);
            }
         });
    }
});    
于 2012-12-05T12:23:49.347 回答
0

我的想法是创建一个 getData 函数,您可以将 url 传递给它并进行回调。在最后一个回调中callme()传递两个返回的数据对象。

function callme(JSON1, JSON2) {}

function getData(url, fn) {
    $.ajax({
        url: url,
        type: "GET",
        dataType: "json",
        success: fn
    });
}

getData("url", function(JSON1) {
    getData("url", function(JSON2) {
        callme(JSON1, JSON2);
    });
});
于 2012-12-05T12:26:28.273 回答
0

您不能指望同时处理两个单独的 ajax 调用,因为 JS 是单线程的(并且 AJAX 调用是异步的,以免您指定它们不是 - 但这是要避免的),因此不能期望同时处理两个单独的 ajax 调用。另外:您不能期望 JS 考虑您为任何函数指定的参数数量,并且知道在两个参数都有值之前它不应该调用该函数。

最后:您能否具体说明您的问题是什么:您在询问如何调用另一个函数,但在这两种情况下,您似乎都在传递相同的成功回调。您能否详细说明两个调用都将返回哪些数据,以及您要发送哪些数据?

如果您希望仅在两次调用都成功后才调用函数,则可以使用闭包:

var callme = (function()
{
    var JSON1, JSON2;
    return function(response)//this function will receive each response separately
    {
        JSON1 = JSON1 || response;//if JSON1 isn't set, assign current response
        if (JSON1 !== response)
        {//JSON1 was already set, second response is in
            JSON2 = response;
            //code to process both responses at once goes here
            //but make them undefined before returning, if not, a second call won't work as expected
            JSON1 = undefined;
            JSON2 = undefined;
        }
    };
}();
$.ajax({url: 'some/url',
       data: yourData1,
       type: 'GET',
       success: callme});
$.ajax({url: 'second/url',
        data: yourData2,
        type: 'GET',
        success: callme});

请记住,闭包(callme函数)在 AJAX 调用之前至关重要:由于callme分配函数(作为表达式)的方式,函数声明不会被提升!

于 2012-12-05T12:26:46.817 回答
-1

您可以通过将 async 属性设置为 false 来将 ajax 设置为同步调用。以便在两个请求都成功后调用callme函数。

var JSON1, JSON2
$.ajax({ 
   url: url,
   type:'GET',
   dataType: 'json',
   async: false,
   success: function(data){JSON1=data}
 });    

$.ajax({ 
   url: url,
   type:'GET',
   dataType: 'json',
   async: false
   success: function(data){JSON2=data}
});

callme(JSON1,JSON2);

function callme(JSON1,JSON2){
}

而已。

于 2012-12-05T12:23:00.753 回答