javascript - 无法掌握回调的时机

标签 javascript node.js callback

我知道这个问题已经被问过一百万次了,但我真的很想分解异步 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 才会发生已经发生了?我们是否应该假设 doneReadingfs.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/

相关文章:

javascript - Node-ffi 窗口列表

php - 指向友好 URL 的 HTML 表单

javascript - 将数组复制到 Javascript 中较大数组的中间

javascript - 使变量像窗口一样可访问

css - Node express + CSS

C# 字符串编码和 LocalAlloc

javascript - 如何在没有 JavaScript 库的情况下检测过渡结束?

javascript - Sequelize 五5,通天七7 : TypeError: Class constructor Model cannot be invoked without 'new'

node.js - 发现不兼容的模块 Node -不支持-创建 react 应用程序

c++ - 将成员函数分配给实例成员的属性