2015-11-19 88 views
0

我對Javascript編程非常陌生,正在研究處理異步函數的方式。我碰到真正有用的資源,列出這個作爲一個例子來:使用回調函數和調用方法的區別

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) 

但是你可以達到同樣的效果這樣做:

var fs = require('fs') 
var myNumber = undefined 

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

function logMyNumber() { 
    console.log(myNumber) 
} 

addOne() 

,如果你能,會是什麼目的/優勢使用回調?

對於那些有興趣的文章從這裏走過:https://github.com/maxogden/art-of-node#callbacks

回答

1

當我們使用回撥它取決於形勢使事情的動態,或者確保一塊運行的一個後一個代碼complete.in您當前的代碼已經描述回調

你的第一個例子清楚地說明我們如何定義回調。

在計算機編程,回調是一段可執行代碼,該代碼作爲參數傳遞給其他代碼,這有望回電(執行)在一些方便的時間的參數傳遞。該調用可以是直接在同步回調,也可能在稍後的時間發生在異步回調

var fs = require('fs') 
var myNumber = undefined 

您使用的電話回到這裏,給你的權力運行後讀不同 - 不同的方法number.txt成功

function addOne(callback) { 
    fs.readFile('number.txt', function doneReading(err, fileContents) { 
     myNumber = parseInt(fileContents) 
     myNumber++ 
     callback() 
    }) 
} 
在你的第二個例子

沒有回調您呼叫直接logMyNumber(),如果我們需要運行其他功能類似

function logMyNumber() { 
    console.log(myNumber) 
} 

function varifynumber() { 
    console.log(myNumber) 
} 

function somthingelse() { 
    console.log(myNumber) 
} 


addOne(logMyNumber) 
addOne(somthingelse) 
addOne(logMyNumber) 

和JavaScript中的其他最佳利用回調是處理異步任務,你是否注意到 您使用fs.readFile('number.txt',callback)你的函數,它是一個異步方法,請有下面的例子看看裏面

console.log('start'); 
fs.readFile('number.txt', function doneReading(err, fileContents) { 
      // until the file not read completely this section will not run 
      // this happend because of call back 
     console.log('Reading complete'); 
     }) 
console.log('End'); 

output : 
start 
End 
Reading complete 

我希望這將幫助你

+0

很好的解釋!我花了很大一部分時間玩回調,發現它們對於非常不可預知的代碼非常有用。很高興看到使用的不同示例,以及爲什麼直接致電不是個好主意 - 謝謝! – Novastorm

+0

很高興聽到:) –

0

這一切都取決於你想要達到的目的。在第一個示例中,函數addOne對回調參數的作用沒有概念,只是調用它。

但是,在第二種情況下,addOne函數知道它將調用logMyNumber,因此它具有更緊密的耦合以及正在發生什麼的概念。

在大多數情況下,第一個例子通常是有利的,例如,如果你在多個文件中分割函數,並且不希望它們緊密交織在一起。

+0

我明白了,所以在第二個例子中,你仍然可以在調用logMyNumber之前獲得readFile函數來完成第一個任務嗎? – Novastorm

+0

調用'fs.readFile'後,程序會恢復,並且在將來的某個時候,您提供給函數的第二個參數將會執行。我已經對你的例子進行了格式化,使其更加清晰。 – whirlwin

相關問題