gpt4 book ai didi

javascript - 一个接一个地解决 promise (即按顺序)?

转载 作者:IT老高 更新时间:2023-10-28 13:13:17 25 4
gpt4 key购买 nike

考虑以下以串行/顺序方式读取文件数组的代码。 readFiles 返回一个 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 with the first file!
});
};

上面的代码有效,但我不喜欢为了顺序发生的事情而进行递归。有没有更简单的方法可以重写这段代码,这样我就不必使用我奇怪的 readSequential 函数了?

最初我尝试使用 Promise.all,但这导致所有 readFile 调用同时发生,这 不是想要:

var readFiles = function(files) {
return Promise.all(files.map(function(file) {
return readFile(file);
}));
};

最佳答案

2017 年更新:如果环境支持,我会使用异步函数:

async function readFiles(files) {
for(const file of files) {
await readFile(file);
}
};

如果您愿意,可以使用异步生成器(如果您的环境支持)推迟读取文件,直到您需要它们:

async function* readFiles(files) {
for(const file of files) {
yield await readFile(file);
}
};

更新:再想一想 - 我可能会使用 for 循环:

var readFiles = function(files) {
var p = Promise.resolve(); // Q() in q

files.forEach(file =>
p = p.then(() => readFile(file));
);
return p;
};

或者更简洁,使用reduce:

var readFiles = function(files) {
return files.reduce((p, file) => {
return p.then(() => readFile(file));
}, Promise.resolve()); // initial
};

在其他 Promise 库(例如 when 和 Bluebird)中,您可以使用实用方法。

例如, bluebird 是:

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));

var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 });
// if the order matters, you can use Promise.each instead and omit concurrency param

readAll.then(function(allFileContents){
// do stuff to read files.
});

虽然今天确实没有理由使用异步等待。

关于javascript - 一个接一个地解决 promise (即按顺序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24586110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com