2014-09-04 92 views
0

我遇到了匿名函數節點js的問題,想知道如何從異步函數中獲取數據。這樣,它返回一個空的Web API,因爲它返回的異步結束通話前的SQLiteNodejs獲取數據的異步功能

restapi.get('/data', function(req, res){ 
var array = []; 
    db.each("SELECT value FROM counts", function(err, row){ 
     array.push(row); 
    }); 

res.json(array); 
}); 

有人能解釋我是如何工作和解決的方法嗎?謝謝

回答

2

這就是使用回調進行異步編程的重點。異步函數不是返回一個結果,而是接受一個回調函數,這個函數一旦完成就會被觸發。該回調將接收異步工作的結果作爲其參數。

不要指望異步函數返回任何東西。相反,將結果處理邏輯嵌套在您傳遞給該函數的回調中。

因此,您的文檔片斷應該是這個樣子:

restapi.get('/data', function(req, res){ 
    var array = []; 

    db.each("SELECT value FROM counts", function(err, row) { 
     if (row) { 
      array.push(row); 
     } 
     else { 
      res.json(array); // When there are no more rows 
     } 
    }); 
}); 

與平面回調的工作是一個相當痛苦。無盡的嵌套往往會混淆你的代碼。如果你爲你的回調命名,你可以幫助你自己,並使用命名版本而不是嵌套。那隻會讓你走到盡頭。更好的解決方案是使用像async這樣的控制流程庫。然而,爲了工作,所有的回調必須是可組合的 - 也就是說,遵循接受錯誤對象作爲第一個參數的約定。例如,請參閱this explaination

+0

感謝您的回答和澄清,可以給我示例以更好地理解? – user2726677 2014-09-04 13:45:05

+0

只是答案。現在再添加一個有用的位。 – 2014-09-04 13:48:05

+0

非常感謝伊萬! – user2726677 2014-09-04 13:49:32