【发布时间】:2015-06-25 18:46:11
【问题描述】:
我正在尝试将一系列同步调用变为异步调用,并且我正在使用 when...done...最近两天,我下面的代码应该可以工作。嗯,它确实有效,但并不完全按照我的意思。
在下面的测试代码中,我进行了五次调用,每次调用都会花费不同的时间(在我的示例中,它基于字符串的长度...每个字符 1/2 秒)。我的期望是花费更少时间的调用(即在我的示例中长度较短的字符串)将首先完成,我会快速触发所有五个调用,并期望结果按照执行时间较短到执行时间较长的顺序显示。
这是我的代码:
var cars = ["Saab", "Chrysler", "Volvo", "BMW", "GT"];
loopAll(cars);
document.getElementById("demo").innerHTML += "Start!<br>";
function loopAll(array) {
for (var i in array) {
$.when( encapsulate(array[i]) ).done( printIt );
}
function encapsulate(name){
var a = $.Deferred();
setTimeout(function(){pause(name.length*500);a.resolve(name);}, 0);
return a;
}
}
function printIt(name){
document.getElementById("demo").innerHTML += name + "<br>";
}
function pause(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
数组中的每个元素都被打印出来,我可以看到它们一个一个地出现在显示器上。但是,它们似乎是同步的,因为它们以数组的原始顺序显示,并且在每个显示的元素之间发生了暂停。然而,我的期望是较短的执行函数比较长的函数更快地完成(和显示)。
注意:我不是要对数组进行排序。我的意图是触发多个调用并让较短的执行调用首先完成,而不是按顺序完成。我仅以字符串数组为例。
【问题讨论】:
-
setTimeoutencapsulate似乎设置为0? -
@guest271314,是的。在这个网站上阅读,我认为这是立即启动该代码的好方法,有效地为该代码创建一个新线程。
-
"在下面的测试代码中,我进行了 5 次调用,每次调用的时间都不同(在我的示例中,它基于字符串的长度... 1/每个字符 2 秒)。” ?如果在
encapsulate创建的每个$.Deferred的每个setTimeoutduration设置为0,则在encapsulate调用的setTimeout中的每个duration使用的字符串长度not ? , 而0出现在每次迭代中?
标签: javascript jquery asynchronous .when