2017-04-08 37 views
0

我正在學習node.js,並且遇到問題。如何從函數獲取數據到變量?如何從函數獲取數據到變量

function loadOrInitializeTaskArray(file, cb) { 
     fs.exists(file, function(exists) { 
       var tasks = []; 
       if (exists) { 
        fs.readFile(file, 'utf8', function(err, data) { 
          if (err) throw err; 
          var data = data.toString(); 
          var tasks = JSON.parse(data || '[]'); 
          cb(tasks); 
        }) 
       } else { 
         cb([]); 
       } 
     }) 
} 



function listTasks(file) { 
     loadOrInitializeTaskArray(file, function(tasks) { 
       for (var i in tasks) { 
         console.log(tasks[i]); 
       } 
     }) 
} 

功能listTasks正常工作,但我想創建自己的功能,例如customListTasks:

function customListTasks(file) { 
     var list = loadOrInitializeTaskArray(file, function(){}); 
     console.log(list); 
} 

這不歸我的錯誤,但CONSOLE.LOG名錄還給我「不確定」。我怎樣才能獲得這個數據到變量列表?

+0

使用藍鳥協同函數和使用,你可以產生承諾 –

+0

http://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a-callback-has-been-called -using-node-js –

+0

您不能期望同步獲得異步結果。你將不得不異步獲取它(回調,承諾)。 – trincot

回答

0

簡答:你不能。

由於loadOrInitializeTaskArray中的加載是異步的,所有魔法都必須在您傳遞的回調中發生。你不能僅僅從中「返回」一個值。

選項1:將所有依賴加載數據的邏輯放在您作爲回調傳遞的匿名函數中。

var list = loadOrInitializeTaskArray(file, function(tasks){ 
    console.log(tasks); 
}); 

選項2:使用Promises。它們基本上像回調一樣工作,但稍微靈活一點,並且使鏈接更容易。