嵌套回调卡在循环中

时间:2013-05-18 19:04:55

标签: javascript jquery ajax callback

我有嵌套回调,设置如下:

function submitForm() {
  BuildContent($('#Content').val(), '', true, submitForm)   
  PerformSubmit();
}

function BuildContent(textWithUrl, textSource, isSubmit, callback) {
  console.log("GetWebContent in Progress");
  GetWebContent(sendurls, BuildContent)
  console.log("GetWebContent done");
  callback();
}

function GetWebContent(content, callback) {
  $.ajax({....
    sucess:function(msg) { .....
      callback();
  }

}

预期结果是在调用submitForm时调用Build Conetent调用GetWebContent。 o * nly在GetWebContent内部的ajax调用成功之后,只有PerformSubmit();执行。 *由于某种原因它循环并且JS挂起并变得无响应,BuildContent控制台日志继续打印循环。

2 个答案:

答案 0 :(得分:1)

在console.log之后调用的BuildContent回调是函数submitForm 它迅速调用BuildContent因此无限循环。

如果不进行深入分析,我建议您删除callback末尾的来电BuildContent,然后将其作为调用GetWebContent的第二个参数传递。 / p>

经过多方面的考虑后,在submitForm回调中,您发送给BuildContent的应该是PerformSubmit。我对buldContent的改动。

答案 1 :(得分:0)

看起来你对回调如何运作有误解。当回调返回时,它不会从中断处继续执行。调用回调的函数立即完成。

您需要像这样构建代码:

function submitForm(){
    BuildContent($('#content').val(), '', true, performSubmit);
}

function BuildContent(textWithUrl, textSource, isSubmit, callback){
    console.log("GetWebContent in Progress");
    GetWebContent(sendurls, callback);
}

function GetWebContent(content,callback){
    $.ajax({...
        success:function(msg){ ....
            console.log("GetWebContent done");
            callback(); <-- performSubmit is being called here, 
                        after all of the asynchronous work is done
        }
    });
}

您会注意到我将performSubmit作为回调传递给其中每个函数,然后在success函数中调用它。

BuildContent中的GetWebContent调用之后的任何内容都会立即执行,所以你不能期望第二次调用console.log是在ajax请求完成之后。