Ajax调用(b)在另一个ajax调用(a)的回调内执​​行(a)完成之前

时间:2013-07-09 02:10:18

标签: javascript ajax asynchronous callback

我有一个ajax调用,让我们说回调(b),在另一个ajax调用的回调中,让我们说回调(a)。在我的代码中(b)取决于ajax调用(a)的成功。但是,与我的预期相反,ajax调用(b)在父ajax调用(a)完成之前仍然成功完成。

的Javascript

var ajaxAdata; //global

ajaxA(ajaxB(1));

function ajaxA(callback){
       FB.api('/me', function(response) { //ajax call(a)
            ajaxAdata = response.id; 
            callback(); // this completes before ajax call(a) completes
       }
}

ajaxB = function(isPublic) {
       .getJSON(){ //ajax call (b)
            console.log(ajaxAdata); // necessary ajaxAdata returns undefined
        }
}

我对这里的javascript一无所知吗?我在许多地方读过回调函数是处理异步调用的正确方法。在这种情况下,javascript是否仍然预读到ajaxB函数并在FB.api()调用完成之前开始执行.getJSON()?

4 个答案:

答案 0 :(得分:2)

您的电话

ajaxA(ajaxB(1));

在调用ajaxB(1)之前执行ajaxA,以便为ajaxA提供参数值。

应该是

ajaxA(ajaxB, 1);

function ajaxA(callback, param){
       FB.api('/me', function(response) { //ajax call(a)
            ajaxAdata = response.id; 
            callback(param); // this completes before ajax call(a) completes
       }
}

答案 1 :(得分:2)

应该是:

ajaxA(function() {ajaxB(1);} );

您首先调用ajaxB(),并将其返回值(undefined)作为callback参数传递给ajaxA()。您希望传递一个调用ajaxB()作为回调的函数。

答案 2 :(得分:1)

您正在此处执行ajaxB:

ajaxB(1)

我认为您要做的是从ajaxB返回一个函数,或者找到一种方法将isPublic标志传递给您的ajaxA函数,如:

ajaxA(ajaxB, 1);

function ajaxA(callback, isPublic){
       FB.api('/me', function(response) { //ajax call(a)
            ajaxAdata = response.id; 
            callback(isPublic); // this completes before ajax call(a) completes
       }
}

答案 3 :(得分:1)

ajaxA(ajaxB(1));

实际执行ajaxB ,,然后使用结果作为参数传递给ajaxA。

你需要传递函数,而不是结果。

所以试试

ajaxA(ajaxB);

然后,在ajaxA中,使用

将参数传递给回调
callback(1);