2017-08-23 61 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。 它們是非常酷的東西,它可以幫助您像在同步環境中那樣構建代碼,但會運行異步代碼。