考虑以下以串行/顺序方式读取文件数组的代码。 readFiles
返回一个承诺,只有在所有文件都按顺序读取后才会解决。
var readFile = function(file) {
... // Returns a promise.
};
var readFiles = function(files) {
return new Promise((resolve, reject) => {
var readSequential = function(index) {
if (index >= files.length) {
resolve();
} else {
readFile(files[index]).then(function() {
readSequential(index + 1);
}).catch(reject);
}
};
readSequential(0); // Start with the first file!
});
};
上面的代码有效,但我不喜欢为了顺序发生的事情而进行递归。有没有更简单的方法可以重写这段代码,这样我就不必使用我奇怪 readSequential
函数了?
最初我尝试使用 Promise.all
,但这导致所有 readFile
调用同时发生,这 不是 我想要的:
var readFiles = function(files) {
return Promise.all(files.map(function(file) {
return readFile(file);
}));
};
原文由 XåpplI‘-I0llwlg’I - 发布,翻译遵循 CC BY-SA 4.0 许可协议
2017 年更新:如果环境支持,我会使用异步函数:
如果您愿意,您可以推迟读取文件,直到您需要使用异步生成器(如果您的环境支持):
更新:再想一想 - 我可能会使用 for 循环:
或者更紧凑,使用 reduce:
在其他 Promise 库(如 when 和 Bluebird)中,您有用于此目的的实用方法。
例如,蓝鸟将是:
尽管今天确实没有理由 不 使用 async await。