如果你有一系列的相互依赖的异步任务,那么你就需要嵌套这些异步任务的回调函数。比如,你需要拷贝一份文件的内容,那么你首先要读取该文件的内容,然后把它写入到另一份文件中。这意味着,你需要在readFile
的回调函数中调用writeFile
:
const fs = require('fs')
fs.readFile('file.txt', 'utf-8', function readContent(err, content) {
if (err) {
return console.log(err)
}
fs.writeFile('copy.txt', content, function(err) {
if (err) {
return console.log(err)
}
return console.log('done')
})
})
现在,如果你有许多相互依赖的异步任务,你可能会感到混乱。在这样的情形下,我们最好独立地声明每一个函数,并给它们一个有意义的名称,以此来避免混乱:
const fs = require('fs')
fs.readFile('file.txt', 'utf-8', readCb)
function readCb(err, content) {
if (err) {
return console.log(err)
}
return fs.writeFile('copy.txt', content, writeCb)
}
function writeCb(err) {
if (err) {
return console.log(err)
}
return console.log('Done')
}
上面的代码片段中,我们单独定义了两个函数,readCb
和writeCb
。或许,从上面的例子看到的好处尚不明显,但是对于多重异步操作下,为异步函数命名会为你避免不少烦恼。