我有嵌套回调,设置如下:
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控制台日志继续打印循环。
答案 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请求完成之后。