Javascript – 完成所有嵌套forEach循环后的回调
作者:互联网
我确信这是一项相当简单的任务,但此时我无法绕过它.我有一组嵌套的forEach循环,我需要在所有循环完成运行时进行回调.
我愿意使用async.js
这就是我正在使用的:
const scanFiles = function(accounts, cb) {
let dirs = ['pending', 'done', 'failed'];
let jobs = [];
accounts.forEach(function(account) {
dirs.forEach(function(dir) {
fs.readdir(account + '/' + dir, function(err, files) {
files.forEach(function(file) {
//do something
//add file to jobs array
jobs.push(file);
});
});
});
});
//return jobs array once all files have been added
cb(jobs);
}
解决方法:
使用forEach的第二个参数,索引,您可以检查每次运行最内层循环时是否完成所有循环.
因此,只需在代码中添加几行就可以得到:
const scanFiles = function(accounts, cb) {
let dirs = ['pending', 'done', 'failed'];
let jobs = [];
accounts.forEach(function(account, accIndex) {
dirs.forEach(function(dir, dirIndex) {
fs.readdir(account + '/' + dir, function(err, files) {
files.forEach(function(file, fileIndex) {
//do something
//add file to jobs array
jobs.push(file);
// Check whether each loop is on its last iteration
const filesDone = fileIndex >= files.length - 1;
const dirsDone = dirIndex >= dirs.length - 1;
const accsDone = accIndex >= accounts.length - 1;
// all three need to be true before we can run the callback
if (filesDone && dirsDone && accsDone) {
cb(jobs);
}
});
});
});
});
}
标签:async-js,javascript,node-js 来源: https://codeday.me/bug/20190823/1700849.html