【发布时间】:2015-02-15 22:05:35
【问题描述】:
这是我的示例代码:
function out(msg)
{
$('#output').append(msg + '<br>');
}
var myDeferred = [];
$.each([8, 3, 4, 6, 9, 15, 7, 1], function (index, time)
{
myDeferred.push($.Deferred(function(dfd)
{
setTimeout(function ()
{
out(time);
dfd.resolve();
}, time * 1000);
}).promise());
});
$.when.apply($, myDeferred).then(function ()
{
out('all is done');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
这个输出“1 3 4 6 7 8 9 15 all is done”,同时调用所有回调。
但我要“8 3 4 6 9 15 7 1 all is done”,所有回调一个接一个地调用。
有人可以帮助我吗?
提前致谢
【问题讨论】:
-
你能澄清你想要什么吗?你想要 8 秒过去,打印一条消息,然后 3 秒过去,打印一条消息,...?
-
你是什么意思“所有的回调被同时调用”——它们有不同的
time值和不同的超时时间? -
@JuniorCompressor 你有一个很好的答案,但是 $.Deferred 有可能吗?
-
@Bergi 当我这么说时,我说的是数组 myDeferred 中的回调,而不是 setTimeout 上的回调
-
如果您确实希望显示延迟,请不要在数组上使用
$.when,而是在每个$Defered上单独使用它。不完全清楚你的期望是什么
标签: javascript jquery asynchronous synchronization jquery-deferred