0

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

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*只有在 GetWebContent 中的 ajax 调用成功之后,才只有 PerformSubmit(); 被执行。* 由于某种原因,它会循环并且 JS 挂起并变得无响应,并且 BuildContent 控制台日志会保持循环打印。

4

2 回答 2

1

BuildContent在 console.log 之后调用的回调是submitForm 立即调用的函数,BuildContent因此是一个无限循环。

在不进行深入分析的情况下,我建议callback在结束时删除调用BuildContent并将其作为调用的第二个参数传递给GetWebContent.

经过一番思考,在submitForm您发送到的回调中BuildContent应该是PerformSubmit. 我的改变buldContent站立。

于 2013-05-18T19:27:37.377 回答
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 作为回调传递给每个函数,然后在成功函数中调用它。

BuildContent 中的 GetWebContent 调用之后的任何内容都将立即执行,因此您不能指望对 console.log 的第二次调用是在 ajax 请求完成之后。

于 2013-05-18T19:34:27.717 回答