【发布时间】:2011-08-09 10:33:00
【问题描述】:
我想依次调用三个函数someTask1、someTask2 和someTask3。然而,函数someTask2 涉及Ajax 调用,并使用setTimeout 递归调用自身,除非返回desired 值。代码如下所示:
doListOfTasks: function(myparam){
var someObj = someTask1(myParam);
someTask2(someObj);
someTask3(someObj);
},
someTask2: function(someObj){
$.ajax({
url: "someUrl.do",
type: "POST",
data: ({"id": rowObject.instanceId}),
dataType: "json",
async:false,
success: function(res){
if(res.prop1 != 'desired'){
setTimeout(function(){someTask2(someObj);}, 2000);
}
}
}
);
},
正如您可能已经猜到的那样,此代码的执行不会在调用someTask3 之前等待someTask2 返回。
我希望doListOfTasks 中的代码按顺序执行。我该怎么做?
另外,我不想在success 回调中硬编码someTask3。例如。我不想这样做:
success: function(res){
if(res.prop1 != 'desired'){
setTimeout(function(){someTask2(someObj);}, 2000);
}else{
someTask3(someObj);
}
}
如何做到这一点?
谢谢
编辑#1
问题在于无法调用函数……但问题在于同步。我希望someTask2 完成它正在做的任何事情,然后只有 someTask3 被调用。
someTask2 使用 setTimeout 重复调用自身...我猜这会触发一个新线程,并在第一次调用后返回someTask2...在主线程中触发someTask3。但是,在每个调用 setTimeout 中都会产生(并被杀死)单独的线程,直到满足所需的条件。
这就是为什么当 someTask2 仍在循环时,对 someTask3 的调用会触发。
不确定我的正确程度。
【问题讨论】:
-
你基本上是对的,虽然 JavaScript 只有一个执行线程。一次只能运行一个任务,尽管浏览器内部可以使用不同的线程进行记账,例如跟踪计时器
标签: javascript settimeout