gpt4 book ai didi

javascript - 如何确定所有异步 readFile() 调用是否已完成

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:14 24 4
gpt4 key购买 nike

我正在循环文件目录,对于每个位置,我都使用异步 fs.readFile() 读取此目录中的文件。如何最好地确定所有异步 readFile() 调用是否已完成?

最佳答案

一般策略是通过增加 fs.readFile 回调中的共享计数器来跟踪已读取的文件数量。然后,当该计数器等于文件总数时,您就知道完成了。例如:

function readFiles(paths, callback) {
var processed = 0,
total = paths.length;

// holds results (file contents) in the same order as paths
var results = new Array(total);

// asynchronously read all files
for (var i = 0, len = files.length; i < len; ++i) {
fs.readFile(paths[i], doneFactory(i));
}

// factory for generating callbacks to fs.readFile
// and closing over the index i
function doneFactory(i) {
// this is a callback to fs.readFile
return function done(err, result) {
// save the result under the correct index
results[i] = result;

// if we are all done, callback with all results
if (++processed === total) {
callback(results);
}
}
}
}

可以这样使用:

readFiles(['one.txt', 'two.txt'], function (results) {
var oneTxtContents = results[0];
var twoTxtContents = results[1];
});
<小时/>

如果您使用的是 Node 0.11.13 或更高版本,您还可以使用 native Promise,特别是 Promise.all,它接受一组 Promise 并等待所有 Promise已解决:

function readFiles(paths) {
// for each path, generate a promise which is resolved
// with the contents of the file when the file is read
var promises = paths.map(function (path) {
return new Promise(function (resolve, reject) {
fs.readFile(path, function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
});

return Promise.all(promises);
}

可以这样使用:

readFiles(['one.txt', 'two.txt']).then(function (results) {
var oneTxtContents = results[0];
var twoTxtContents = results[1];
});
<小时/>

最后,有许多库可以使这个(相当常见的)任务变得更容易。

对于基于回调的并行异步任务,您可以使用 async图书馆:

async.map(['one.txt', 'two.txt'], fs.readFile, function (err, results) {
var oneTxtContents = results[0];
var twoTxtContents = results[1];
});

对于基于 Promise 的并行异步任务,您可以使用像 Q 这样的 Promise 库。 ,其中包含用于“promisification” Node 样式函数的实用程序,例如 fs.readFile:

// this is not the only way to achieve this with Q!
Q.all(['one.txt', 'two.txt'].map(function (path) {
// call "promisified" version of fs.readFile, return promise
return Q.nfcall(fs.readFile, path);
})).then(function (results) {
// all promises have been resolved
var oneTxtContents = results[0];
var twoTxtContents = results[1];
});

关于javascript - 如何确定所有异步 readFile() 调用是否已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660551/

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