Javascript 从节点中的多个异步文件读取创建承诺?
如果我们有:Javascript 从节点中的多个异步文件读取创建承诺?,javascript,node.js,Javascript,Node.js,如果我们有: fn1() { [filepath1, filepath2, ..., filepathN].forEach(process); function process(path) { fs.readFile(file, translate); } } translate回调对每个文件的内容进行操作 我们如何使此返回成为一个承诺,以便我们能够执行fn1()。然后(fn2) 如果有一个使用async wait的好解决方案,那也太好了 假设 fn2()需
fn1() {
[filepath1, filepath2, ..., filepathN].forEach(process);
function process(path) {
fs.readFile(file, translate);
}
}
translate
回调对每个文件的内容进行操作
我们如何使此返回成为一个承诺,以便我们能够执行fn1()。然后(fn2)
如果有一个使用async wait
的好解决方案,那也太好了
假设
需要等待,直到处理完fn2()
使用的数组中的所有文件路径fn1
可能会在处理完所有文件之前返回,因为fs.readFile()是异步的…IIUC? `fn1()
for..of
循环中使用wait
:
async fn1() {
for (path of [filepath1, filepath2, ..., filepathN]) {
await new Promise((resolve) => {
fs.readFile(path, (err, data) => {
translate(err, data);
resolve();
});
});
}
}
fn1
,作为一个异步函数,将自动返回一个承诺,该承诺在所有迭代完成后解析,因此您可以使用fn1()。然后(fn2)
如果您想并行而不是串行地readFile
,那么最好将每个readFile
调用成一个承诺数组,然后使用Promise。所有:
fn1() {
const arr = [filepath1, filepath2, ..., filepathN];
return Promise.all(arr.map(path => new Promise((resolve) => {
fs.readFile(path, (err, data) => {
translate(err, data);
resolve();
});
})));
}
这家伙是个疯狂的极客:)