0

我有一个 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

4 回答 4

2

你的来电

ajaxA(ajaxB(1));

executes ajaxB(1)beforeajaxA甚至被调用来提供参数的值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
       }
}
于 2013-07-09T02:15:37.943 回答
2

它应该是:

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

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

于 2013-07-09T02:15:46.997 回答
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
       }
}
于 2013-07-09T02:13:38.343 回答
1
ajaxA(ajaxB(1));

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

您需要传入函数,而不是结果。

所以试试

ajaxA(ajaxB);

然后,在 ajaxA 中,将您的参数传递给回调

callback(1);
于 2013-07-09T02:14:21.073 回答