2017-06-20 156 views
1

我會寫下面的代碼來練習函數與JavaScript中的回調。功能與回調執行回調函數完成前

fs = require('fs'); 

function funcWithCallback(callback) { 

    fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) { 
    if (err) { 
    return console.log(err); 
    } 
    console.log(data.length); 
    }); 
    callback(); 
} 

funcWithCallback(function(){ 
    console.log("string in callback ") 
}) 

該代碼的目的是試圖控制方法執行的順序。字符串「回調字符串」應打印打印文本文件的長度後,但是當我跑這個代碼的結果將是:

>> "string in callback" 
>> 91389 //the length of YouBikeTP.txt 

這不是我期待的結果。 應該

>> 91389 //the length of YouBikeTP.txt 
>> "string in callback" 

任何人都可以告訴我爲什麼會回調函數被調用之前funcWithCallback(回調)完成?我誤解了回調函數的含義嗎?

回答

4

你的代碼改成這樣:

原因:你已經定義爲READFILE回調函數是異步回調。它不會立即執行,而是在文件加載完成時執行。因此,在完成異步回調的console.log後,您需要調用主回調函數。

fs = require('fs'); 

function funcWithCallback(callback) { 

    fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) { 
     if (err) { 
      return console.log(err); 
     } 
     console.log(data.length); 
     callback(); //calling the main callback after the async callback console logs 
    }); 

} 

funcWithCallback(function(){ 
    console.log("string in callback ") 
}) 
+0

謝謝你的回覆,我還有一個問題使用上面的同樣的代碼。 如果我在前一行callback()(您命令的那一行)的readFile回調中添加了一個IO綁定任務(例如,將數據保存到另一個文件或耗時的循環操作),callback()將執行直到I/O限制任務完成? –

+1

yes @張軒銘無論你想要做什麼,如果它是同步的,它將正常工作,即回調將在該任務之後按照我的回答執行。但是如果你正在做的任務是異步的,那麼你將不得不將主回調放在回調中,以完成你正在努力完成的大任務。你也可以使用promises https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –

1

你是不是叫callback()readFile自己的回調中,您呼叫readFile後只調用它,則只有在完成後調用其回調function (err,data)

1

您必須調用fs.readFile回調函數中的callback()。由於應該在asyc函數寫入結果或錯誤後調用回調函數。