Javascript 另一个Ajax调用(a)的回调中的Ajax调用(b)在(a)完成之前执行

Javascript 另一个Ajax调用(a)的回调中的Ajax调用(b)在(a)完成之前执行,javascript,ajax,asynchronous,callback,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)

我有一个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是否仍在FB.api()调用完成之前读取ajaxB函数并开始执行.getJSON()

您正在这里执行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
       }
}

您正在此处执行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
       }
}
实际上正在执行ajaxB,,然后使用结果作为参数传递给ajaxA

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

所以试试看

ajaxA(ajaxB);
然后,在ajaxA中,使用

callback(1);
实际上正在执行ajaxB,,然后使用结果作为参数传递给ajaxA

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

所以试试看

ajaxA(ajaxB);
然后,在ajaxA中,使用

callback(1);
你的电话

ajaxA(ajaxB(1));
在调用
ajaxA
以提供
ajaxA
的参数值之前执行
ajaxB(1)

应该是

ajaxA(ajaxB, 1);

你的电话

ajaxA(ajaxB(1));
在调用
ajaxA
以提供
ajaxA
的参数值之前执行
ajaxB(1)

应该是

ajaxA(ajaxB, 1);

应该是:

ajaxA(function() {ajaxB(1);} );
您首先调用了
ajaxB()
,并将其返回值(
undefined
)作为
callback
参数传递给
ajaxA()
。您希望将调用
ajaxB()
的函数作为回调传递。

它应该是:

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

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

在哪里调用ajaxB?我正试图在ajaxA中将其作为回调()调用。太好了,谢谢大家的回答。在修复之后,调用的顺序与预期的一致。ajaxB在哪里调用?我尝试在ajaxA中将其称为callback()。非常好,谢谢大家的回答。修复后的调用顺序与预期一致。啊,我明白了。是否总是这样,如果我传入一个带有参数的函数调用,例如
ajaxB(1)
,它将在该调用中执行?因为我知道在
ajaxA(function(){…})
匿名函数不应执行…是,因为指定已定义函数的参数是调用该函数的语法。您正在创建的闭包不包括调用语法(例如,var func=function(arg){console.log(arg);}(“我们在这里调用闭包”);)任何形式的表达式
fun1(fun2(arg))
首先运行
fun2
,然后以其返回值作为参数运行
fun1
。例如
alert(parseInt(“123”))
首先调用
parseInt
,然后调用
alert
。啊,对了。我在试图缩短代码时忘记了这一点。我的ajaxB函数很大,所以我不想将整个函数作为参数中的参数传递。我再看看我的代码。啊,我明白了。是否总是这样,如果我传入一个带有参数的函数调用,例如
ajaxB(1)
,它将在该调用中执行?因为我知道在
ajaxA(function(){…})
匿名函数不应执行…是,因为指定已定义函数的参数是调用该函数的语法。您正在创建的闭包不包括调用语法(例如,var func=function(arg){console.log(arg);}(“我们在这里调用闭包”);)任何形式的表达式
fun1(fun2(arg))
首先运行
fun2
,然后以其返回值作为参数运行
fun1
。例如
alert(parseInt(“123”))
首先调用
parseInt
,然后调用
alert
。啊,对了。我在试图缩短代码时忘记了这一点。我的ajaxB函数很大,所以我不想将整个函数作为参数中的参数传递。我会再看一遍我的代码。啊,这是有道理的。谢谢你,我会试试的。啊,这很有道理。谢谢,我会试试这个。