ref*_*tor 2 javascript node.js promise es6-promise
我期待下面的 node.js 代码将按以下顺序打印输出
1000
2000
3000
4000
"All tasks completed"
Run Code Online (Sandbox Code Playgroud)
相反,它按下面提到的顺序打印
"All tasks completed"
1000
2000
3000
4000
Run Code Online (Sandbox Code Playgroud)
编码
'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');
});
Run Code Online (Sandbox Code Playgroud)
需要修改什么,以便最后打印“所有任务完成”。
在您的所有then函数中,您没有返回任何内容,而是触发了异步操作。因此,promise 链与异步操作无关。这就是为什么您无法按照自己的意愿控制流量。
你可以做的是,从每个then处理程序返回一个 Promise ,只有在异步操作完成时才会解决,就像这样
tasks.forEach(function(task) {
promise = promise.then(function() {
return new Promise((resolve, reject) => {
setTimeout(function() {
console.log(task);
resolve();
}, task);
})
});
});
Run Code Online (Sandbox Code Playgroud)
请记住,这将一一触发异步操作。例如,一秒钟后,它将打印 1000,然后将启动第二个异步操作,该操作将等待两秒钟,然后打印 2000,依此类推。基本上,您的程序将在大约 10 秒(1 + 2 + 3 + 4 秒)后退出,因为我们正在按顺序执行所有异步函数。
但是,如果您希望所有这些同时触发,则使用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');
});
Run Code Online (Sandbox Code Playgroud)
现在,所有的异步函数都被一次触发,所以一秒后,将打印 1000,两秒后将打印 2000,依此类推。您的程序将在 4 秒后完成所有异步操作,因为所有异步操作都会立即启动。
| 归档时间: |
|
| 查看次数: |
2920 次 |
| 最近记录: |