考虑以下以串行/顺序方式读取文件数组的代码。readFiles
返回一个promise,仅当依次读取所有文件后,promise才会解析。
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!
});
};
上面的代码可以工作,但是我不喜欢必须递归使事情顺序发生。有没有更简单的方法可以重写此代码,这样我就不必使用怪异的代码了readSequential
函数了?
最初我尝试使用Promise.all
,但是这导致所有readFile
调用同时发生,这不是我想要的:
var readFiles = function(files) {
return Promise.all(files.map(function(file) {
return readFile(file);
}));
};
readFileSequential()
已经返回下一个被调用之前(因为它的异步,它完成后,长原函数调用已经返回)。