执行和延迟序列的承诺数组

我正在尝试执行一系列函数synchronousI usingy。 在调用下一个函数之前,每个函数应该被延迟3秒。 我必须做错事,因为它们都是在3秒钟的时间内同时调用,而不是按顺序调用。

我究竟做错了什么?

var tasks = [] allGroups.forEach(function(group){ tasks.push(deleteFromGroup(group)) }) tasks.reduce(function(cur, next) { return cur.then(next); }, Promise.resolve()).then(function() { console.log("all executed") }); }) } function deleteFromGroup(group){ return new Promise(function(resolve, reject) { setTimeout(function(){ console.log(group.id) resolve() }, 3000); }) } 

创buildtasks数组的方式不可避免地会导致所有同时发生的超时,因为您在第一个.forEach循环中同时创build任务。

为了达到这个效果,你需要实际上不需要创build下一个任务,直到当前的任务被解决。 这是一个伪recursion的实现方式:

 return new Promise(resolve, reject) { var groups = allGroups.slice(0); // clone (function loop() { if (groups.length) { deleteFromGroup(groups.shift()).catch(reject).then(loop); } else { console.log("all executed") resolve(); } })(); }); 

ps在实践中,你可能真的想把3s超时直接合并到循环中,而不是deleteFromGroup ,因为上面的代码(和你的原始代码)在最后的删除调用不会显示“completed”,但是我期待它真的应该在最后立即发生。

这里你不需要求助于callback和明确的构造。 你实际上可以使用一个for循环,但不能用于这个动作,因为承诺是一个已经开始的操作。

所有你需要做的就是合并你的两个循环:

 allGroups.reduce(function(cur, next) { return cur.then(function(){ return deleteFromGroup(next) }); }, Promise.resolve()).then(function() { console.log("all executed") });