Bergi的回答使我使用Array.reduce
.
然而,为了真正让函数返回我的Promise以一个接一个地执行,我不得不添加更多的嵌套。
我的实际用例是一组文件,由于下游限制,我需要依次传输这些文件...
这是我最终的结果:
getAllFiles().then( (files) => {
return files.reduce((p, theFile) => {
return p.then(() => {
return transferFile(theFile); //function returns a promise
});
}, Promise.resolve()).then(()=>{
console.log("All files transferred");
});
}).catch((error)=>{
console.log(error);
});
正如以前的答案所暗示的那样,使用:
getAllFiles().then( (files) => {
return files.reduce((p, theFile) => {
return p.then(transferFile(theFile));
}, Promise.resolve()).then(()=>{
console.log("All files transferred");
});
}).catch((error)=>{
console.log(error);
});
在开始另一个之前没有等待传输完成,并且“所有文件传输”文本甚至在第一个文件传输开始之前就出现了。
不确定我做错了什么,但想分享对我有用的东西。
编辑:自从我写了这篇文章,我现在明白为什么第一个版本不起作用了。then()
期望一个函数返回一个Promise。所以,你应该传入不带括号的函数名!现在,我的函数需要一个参数,所以我需要包含在一个不带参数的匿名函数中!