我编写了一个脚本,它递归地异步修改目录中的js文件。它由一个search(dirname)函数组成,用于搜索目录中的js文件,以及一个执行修改的modify(filename)。
let totalFilesSearched = 0;
const search = (dir) => {
fs.readdir(dir, (err, list) => {
if (err) return;
list.forEach((filename) => {
const filepath = path.join(dir, filename);
if (filename.endsWith('.js')) {
modify(filepath);
} else if (fs.lstatSync(filepath).isDirectory()) {
search(filepath);
}
})
});
}
const modify = (filename) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) console.log(err);
// ... my modification code ...
totalFilesSearched++;
});
}
search(args[0])
console.log(`Total files searched: ${totalFilesSearched}`);我想在脚本的末尾打印出totalFilesSearched,但是因为我的代码是异步的,所以它会立即打印Total files searched: 0。
有谁知道我会怎么等到剧本结束后再把它打印出来吗?我遇到了问题,因为我的search()和modify()函数都是异步的。
发布于 2018-05-27 06:23:16
使用承诺代替,然后调用console.log当一切都解决了。使用promisify将回调转换为承诺:
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const readDir = util.promisify(fs.readdir);
const search = (dir) => (
readDir(dir).then((list) => (
Promise.all(list.map((filename) => {
const filepath = path.join(dir, filename);
if (filename.endsWith('.js')) {
return modify(filepath); // recursively return the promise
} else if (fs.lstatSync(filepath).isDirectory()) {
return search(filepath); // recursively return the promise
}
}))
))
.catch(err => void 0)
);
const modify = (filename) => (
readFile(filename, 'utf8')
.then((data) => {
// other code
totalFilesSearched++;
}).catch(err => console.log(err))
)
search(args[0])
.then(() => {
console.log(`Total files searched: ${totalFilesSearched}`);
});发布于 2018-05-28 07:22:38
自我回答:
只需使用process.on('exit', callback_function_to_execute_at_end)
它内置在节点中,您的回调将在进程退出之前立即执行。
https://stackoverflow.com/questions/50549526
复制相似问题