Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使多重回调与jQuery$.when同步_Javascript_Jquery_Asynchronous_Synchronization_Jquery Deferred - Fatal编程技术网

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,你到底希望发生什么?