Jquery延迟和多个延迟链

时间:2015-11-13 06:58:11

标签: jquery settimeout jquery-deferred

请帮忙:

例如我有20个超时,由window.setTimeout创建,我希望它们一个接一个地运行:

呼叫超时1 =>完成呼叫超时后2 =>完成呼叫超时3之后等等。

通常有一系列函数和超时数量未修复。

我的延期功能

function someFunction(index) {
   console.log("someFunction called, index = " + index);
   var $deferred = $.Deferred();

   window.setTimeout(function () {
       $deferred.resolve();
   }, 2000);

   return $deferred.promise();
}

for loop

var $deferred;
$(someArray).each(function (index) {
    if (!$deferred) {
        $deferred = someFunction(index);
    } else {
        $deferred.then(function () {
            return someFunction(index);
        });
    }
});

所有其他人在没有链的情况下立即运行

3 个答案:

答案 0 :(得分:1)

如果你想一个接一个地链接它们,你必须这样做:

var $deferred;
$(someArray).each(function (index) {
    if (!$deferred) {
        $deferred = someFunction(index);
    } else {
        $deferred = $deferred.then(function () {
            return someFunction(index);
        });
    }
});

您正在做的是将所有.then()处理程序放在相同的延迟处,它们将并行运行它们,而不是串行运行。你需要的是相当于p.then(...)。then(...)。then(...)。由于每个.then()都会返回一个新的承诺,因此您需要链接到链中的下一个链接。

您可能会发现这种设计模式更简单,可以使用生成承诺的异步操作顺序迭代数组:

someArray.reduce(function(p, item) {
    return p.then(function() {
        return someFunction(item);
    });
}, $.Deferred().resolve()).then(function() {
    // all done here
});

工作演示:http://jsfiddle.net/jfriend00/uusjs3mt/

答案 1 :(得分:0)

尝试使用$.queue()$.dequeue()$.map()



function someFunction(index) {
  console.log("someFunction called, index = " + index);
  var $deferred = $.Deferred();

  window.setTimeout(function() {
    $deferred.resolve();
  }, 2000);

  return $deferred.promise();
}

var someArray = [1, 2, 3, 4, 5];

$.queue(someArray, "dfd", $.map(someArray, function(value, index) {
  return function(next) {
    someFunction(index).then(next)
  }
}));
$.dequeue(someArray, "dfd");

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

两种方法都有效:

$.queue(someArray, "dfd", $.map(someArray, function(value, index) {
  return function(next) {
    someFunction(index).then(next)
  }
}));
$.dequeue(someArray, "dfd");

someArray.reduce(function(p, item) {
    return p.then(function() {
        return someFunction(item);
    });
}, $.Deferred().resolve()).then(function() {
    // all done here
});