2017-08-23 22 views
0

我试图通过遵循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(),并且输出是预期的。然而,fs.readFile()之外移动callback(),但如下所示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()已完成引用?

回答

1

你的想法是对的。 Node.js执行fs.readFile,但不是等待它完成。

因此,执行转到下一个调用回调的语句,结果为undefined,因为上一个命令尚未完成。

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。 它们是非常酷的东西,它可以帮助您像在同步环境中那样构建代码,但会运行异步代码。