【问题标题】:Ajax call (b) within callback of another ajax call (a) executes before (a) completes另一个 ajax 调用 (a) 的回调中的 Ajax 调用 (b) 在 (a) 完成之前执行
【发布时间】:2013-07-09 10:15:46
【问题描述】:

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

【问题讨论】:

  • ajaxB在哪里调用?
  • 我正在尝试在 ajaxA 中将其称为 callback()。
  • 完美,谢谢大家的回答。修复后的调用顺序与预期一致。

标签: javascript ajax asynchronous callback


【解决方案1】:

您的电话

ajaxA(ajaxB(1));

在调用ajaxA 之前执行ajaxB(1) 以提供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
       }
}

【讨论】:

    【解决方案2】:

    应该是:

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

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

    【讨论】:

      【解决方案3】:
      ajaxA(ajaxB(1));
      

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

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

      那就试试吧

      ajaxA(ajaxB);
      

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

      callback(1);
      

      【讨论】:

      • 啊,我明白了。如果我在参数中传入带有参数的函数调用,例如ajaxB(1),是否总是会在该调用中执行?因为我知道ajaxA(function(){...}); 中的匿名函数不应该执行...
      • 是的,因为指定定义函数的参数是调用函数的语法。您正在创建的闭包不包括调用语法(例如 var func = function(arg) { console.log(arg); }("We are calling the closure here"); )
      • fun1(fun2(arg)) 形式的任何表达式首先运行fun2,然后运行fun1,并将其返回值作为参数。
      • 例如alert(parseInt("123"))首先调用parseInt,然后调用alert。
      • 啊,对。我在尝试缩短代码时忘记了这一点。我的 ajaxB 函数很大,所以我不想将整个函数作为参数传递给参数。我再看看我的代码。
      【解决方案4】:

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

      【讨论】:

      • 啊,有道理。谢谢你,我会试试这个。
      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多