我知道这个问题已经被问过一百万次了,但我真的很想分解异步 Javascript 函数和回调,但它只是没有点击。我正在查看 Max Ogden 的 Art of Node 示例,如下所示:
var fs = require('fs')
var myNumber = undefined
function addOne(callback) {
fs.readFile('number.txt', function doneReading(err, fileContents) {
myNumber = parseInt(fileContents)
myNumber++
callback()
})
}
function logMyNumber() {
console.log(myNumber)
}
addOne(logMyNumber)
分解这个,我明白当调用 addOne 时,它首先开始 fs.ReadFile
这可能需要一些时间才能完成。
我不明白的是,代码不会继续到 callback()
并执行logMyNumber
(在添加 myNumber
之前)无论如何?什么在阻止callback()
从之前就应该运行,这是什么重点?或者callback()
直到 doneReading
才会发生已经发生了?我们是否应该假设 doneReading
当fs.readFile
时将被调用“完成”了吗?
感谢大家耐心帮助我解决这个非常常见的问题:)
最佳答案
“我们是否应该假设当 fs.readFile 为“完成”时将调用 didReading?”
你不必假设它,你可以非常确定它。 您可以使用日志记录来查看代码的执行方式和顺序。
var fs = require('fs')
console.log("starting script");
console.log("message 1");
function addOne(callback) {
fs.readFile('number.txt', function doneReading(err, fileContents) {
console.log("finished loading the file");
console.log("message 2");
callback()
})
}
console.log("message 3");
//logMyNumber will be called after file has read
function logMyNumber() {
console.log("message 4");
}
console.log("message 5");
addOne(logMyNumber)
console.log("message 6");
//______________ 理解异步行为的一种更简单的方法是使用所有熟悉的计时器
console.log("message 1");
var num = 2;
function something() {
console.log("message 2");
}
function somethingElse() {
console.log("message 3");
}
console.log("message 4");
setTimeout(something, 1000);
console.log("message 5");
setTimeout(somethingElse, 500);
//代码将运行 1 - 4 - 5 - 3- 2,而不是从上到下,这样一来,原因就很明显了。 //在文件中读取其相同的原因
关于javascript - 无法掌握回调的时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867627/