异步函数中回调位置的影响

时间:2017-08-23 08:59:14

标签: node.js

我正在尝试按照this guide了解NodeJS中的异步回调,我对callback()在下面的代码段中的位置有疑问。

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)

此处,我的文件'number.txt'包含数字1,整个代码段的输出为2。在读取文件后,这似乎是在调用callback(),并且预期输出。但是,如下所示,将callback()移到fs.readFile()之外但在addOne()之内移动会让我感到困惑,因为输出现在是undefined

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)

这是否意味着在第二个示例中,在callback()完成之前调用了fs.readFile()

2 个答案:

答案 0 :(得分:1)

你的想法是正确的。 Node.js执行Nan不会等待它完成。

因此执行转到next语句,该语句调用回调,结果为fs.readFile,因为前一个命令尚未完成。

答案 1 :(得分:0)

异步编程非常有趣,但很简单。 异步执行意味着程序不会逐行同步运行代码,等待完成每行代码当你执行阻塞代码时,而是执行并发执行(并发)。

阻止代码是指您执行示例http请求,读取示例中的文件或浏览器中的DOM事件。基本上阻塞代码的代码不依赖于您的代码。基本上阻止代码是指您的程序应该等待未知的持续时间直到完成继续。

在算术和数组运算等基本的javascript操作上,例如循环 代码同步运行,因为它们不依赖于外部资源。

这就是为什么我们在JavaScript中有回调而不等待它们完成。 回调可以帮助我们在执行异步代码后运行代码。 异步意味着我们的代码是非阻塞

所以在你的代码中运行

fs.readFile('number.txt', function doneReading(err, fileContents) {
    myNumber = parseInt(fileContents)
    myNumber++
})
callback()

它将开始运行fs.readFile并立即开始执行callback功能。

但是当你跑的时候

fs.readFile('number.txt', function doneReading(err, fileContents) {
    myNumber = parseInt(fileContents)
    myNumber++
    callback()
})

它将开始执行fs.readFile并在其回调 doneReading函数中执行myNumber操作并执行callback

大多数JavaScript异步函数都有回调函数。

您可以阅读有关阻止和非阻止代码here的信息,此处还有callbacks

您还可以阅读promisesasync/await。 它们非常酷,可以帮助您像在同步环境中一样构建代码,但运行异步代码。