你如何同步解决一系列es6承诺?

Ben*_*vis 20 javascript promise

我有一个返回promise的库中的函数.我需要多次运行此函数,但每次迭代必须等到上一个任务完成.

我的假设是我能做到这一点:

promiseReturner(1)
  .then(promiseReturner(2)
  .then(promiseReturner(3)
  .then(...)
Run Code Online (Sandbox Code Playgroud)

可以使用循环简化:

var p = Promise.resolve();
for (var i=1; i<=10; i++) {
  p = p.then(promiseReturner(i));
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,链中的每个承诺都会同时执行,而不是一个接一个地执行,.then()似乎意味着.显然,我遗漏了一些关于承诺的基本信息 - 但在阅读了几篇教程和博客文章后,我仍然迷失了.

这是我写的代码笔,用来演示我的尝试.

Fel*_*ing 23

您的"非循环"解决方案也不应该起作用.你必须通过一个函数.then,而不是一个承诺:

var p = Promise.resolve();
for (var i=1; i<=10; i++) {
  (function(i) {
      p = p.then(function() {
          return promiseReturner(i);
      });
  }(i));
}
Run Code Online (Sandbox Code Playgroud)

如果该函数返回一个promise,那么你将获得该链接效果.

有关MDN上的 promises的更多信息.


可以用let(和箭头功能)简化:

var p = Promise.resolve();
for (let i=1; i<=10; i++) {
    p = p.then(() => promiseReturner(i));
}
Run Code Online (Sandbox Code Playgroud)

或者.bind(这是ES5):

var p = Promise.resolve();
for (var i=1; i<=10; i++) {
    p = p.then(promiseReturner.bind(null, i));
}
Run Code Online (Sandbox Code Playgroud)

  • 也许更清楚:"你必须通过一个函数*返回一个承诺*"? (2认同)