使用ES6的顺序迭代承诺

我期待下面的node.js代码将按以下顺序打印输出

1000 2000 3000 4000 "All tasks completed" 

而是按照下面提到的顺序打印

 "All tasks completed" 1000 2000 3000 4000 

代码

 'use strict'; var tasks = [1000, 2000, 3000, 4000]; var promise = Promise.resolve(); function test() { tasks.forEach(function(task) { promise = promise.then(function() { setTimeout(function() { console.log(task); }, task); }); }); } test(); promise.then(function() { console.log('All tasks completed'); }); 

需要修改哪些内容才能完成“所有任务”。

  1. 我的例子使用ES6承诺,而不是蓝鸟。
  2. 另外,我不是在问一个关于承诺的普遍问题,而是关于一个具体的例子。

在你所有的函数中,你都不会返回任何东西,而是触发一个asynchronous操作。 所以,承诺链与asynchronous操作无关。 这就是为什么你无法像你所希望的那样控制stream量。

你可以做的是,从每个处理程序返回一个Promise,只有在asynchronous操作完成时才会parsing,如下所示

  tasks.forEach(function(task) { promise = promise.then(function() { return new Promise((resolve, reject) => { setTimeout(function() { console.log(task); resolve(); }, task); }) }); }); 

请记住, 这将会一个接一个地触发asynchronous操作 。 例如,一秒之后,它将打印1000,第二个asynchronous操作将开始等待两秒,然后打印2000等等。 基本上,你的程序将在大约10秒(1 + 2 + 3 + 4秒)之后退出,因为我们正在顺序执行所有的asynchronous函数。


但是如果你想让他们全部触发 ,那就用Promise.all

 'use strict'; var tasks = [1000, 2000, 3000, 4000]; function test() { return Promise.all(tasks.map(function(task) { return new Promise((resolve, reject) => { setTimeout(function() { console.log(task); resolve(); }, task); }) })); } test().then(function() { console.log('All tasks completed'); }); 

现在,所有的asynchronousfunction都被立即触发,所以一秒钟后,1000将被打印,两秒钟后将被打印,等等。 您的程序将在4秒后完成所有asynchronous操作,因为所有这些操作都是立即启动的。