Javascript 使多重回调与jQuery$.when同步
这是我的示例代码:Javascript 使多重回调与jQuery$.when同步,javascript,jquery,asynchronous,synchronization,jquery-deferred,Javascript,Jquery,Asynchronous,Synchronization,Jquery Deferred,这是我的示例代码: 功能输出(msg) { $(“#输出”).append(msg+”); } var myDeferred=[]; $。每个([8,3,4,6,9,15,7,1],函数(索引,时间) { myDeferred.push($.Deferred)(函数(dfd) { setTimeout(函数() { 外出(时间); 解析(); },时间*1000); }).promise()); }); $.when.apply($,myDeferred).then(函数() { 退出(“一切
功能输出(msg)
{
$(“#输出”).append(msg+”
);
}
var myDeferred=[];
$。每个([8,3,4,6,9,15,7,1],函数(索引,时间)
{
myDeferred.push($.Deferred)(函数(dfd)
{
setTimeout(函数()
{
外出(时间);
解析();
},时间*1000);
}).promise());
});
$.when.apply($,myDeferred).then(函数()
{
退出(“一切都完成了”);
});代码>
将数据传递到resolve()
中,然后在when()
中接收解析数据数组,而不是将响应记录在初始循环中。相反,在该数组上循环,所有操作都将正常进行
var myDeferred = [];
$.each([8, 3, 4, 6, 9, 15, 7, 1], function (index, time)
{
myDeferred.push($.Deferred(function(dfd)
{
setTimeout(function ()
{
/* pass data to resolve()*/
dfd.resolve(time);
}, time * 100);
}).promise());
});
$.when.apply($, myDeferred).then(function ()
{
/* loop over arguments */
$.each(arguments,function(_, time){
out(time);
});
console.log(arguments);
out('all is done');
});
问题是每个回调超时几乎同时被激活。不过,您可以执行以下操作:
function out(msg)
{
$('#output').append(msg + '<br>');
}
function foo(index, callback) {
var time = array[index];
out(time);
if (index == array.length - 1)
callback();
else
setTimeout(foo, time * 1000, index + 1, callback);
}
var array = [8, 3, 4, 6, 9, 15, 7, 1];
foo(0, function ()
{
out('all is done');
});
功能输出(msg)
{
$(“#输出”).append(msg+”
);
}
函数foo(索引、回调){
变量时间=数组[索引];
外出(时间);
if(index==array.length-1)
回调();
其他的
setTimeout(foo,时间*1000,索引+1,回调);
}
var数组=[8,3,4,6,9,15,7,1];
foo(0,函数()
{
退出(“一切都完成了”);
});
使用承诺:
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)
{
var f = function() {
out(time);
dfd.resolve();
}
if (index > 0)
myDeferred[index - 1].done(function() { setTimeout(f, time * 1000); });
else
setTimeout(f, time * 1000);
}).promise());
});
$.when.apply($, myDeferred).then(function ()
{
out('all is done');
});
功能输出(msg)
{
$(“#输出”).append(msg+”
);
}
var myDeferred=[];
$。每个([8,3,4,6,9,15,7,1],函数(索引,时间)
{
myDeferred.push($.Deferred)(函数(dfd)
{
var f=函数(){
外出(时间);
解析();
}
如果(索引>0)
myDeferred[index-1].done(函数(){setTimeout(f,time*1000);});
其他的
设置超时(f,时间*1000);
}).promise());
});
$.when.apply($,myDeferred).then(函数()
{
退出(“一切都完成了”);
});
违背了OP试图抓住的承诺的目的。在ajax情况下,无法保证返回数据的顺序与发出请求的顺序相同。因此,此解决方案要求在启动新的过程之前完成先前的过程,这需要更长的时间。是的,但我认为是@dtcSearch askshis是我的回答,只是,@JuniorCompressor更接近我的演示?可能吗?@charlietfl这不是速度问题,这是一个演示代码,我在indexedDB multi-insert(用于不同时使用multi-insert阻止客户端浏览器)的情况下使用过它。你能澄清一下你想要什么吗?您是否希望8秒通过,打印消息,然后3秒通过,打印消息?“同时调用所有回调”是什么意思?它们有不同的time
值和不同的超时时间?@JuniorCompressor您回答得很好,但使用$.Deferred是否可能?@Bergi当我这么说时,我在数组myDeferred中谈到回调,不是SetTimeOut上的回调如果您确实希望显示延迟,请不要使用$。在数组上使用时,请分别在每个$延迟的上使用它。不完全清楚您的期望是什么我希望对数组myDeferred的回调不会同时被调用,这里,它只是以正确的顺序进行的结果,但我会更多地讨论如何做到这一点。感谢这个演示,你解决了我的另一个问题(带参数),但不是这个问题。因此,基于开始时间0,你到底希望发生什么?