2011-12-19 77 views
0

這讓我有點循環;我不完全確定如何分階段的問題。我有一個對象具有從數據庫中提取並寫入數據庫的多個屬性。一個例子可能是:節點:處理異步大自然

// This is an over simplified example. this._connection() returns a valid DB connection 
var delay = { 
    'time' : function() { 
    this._connection().query('SELECT * FROM delay', function(err, result, fields) { 
     return result.length ? result[0].time : 60; 
    } 
    } 
} 

現在,如果我嘗試使用此代碼....

console.log('Current Delay:' + delay.time()); 

它打印,因爲我所料,「未定義」,因爲MySQL的回調沒」在返回方法delay()之前執行,因此回調內部的return不會執行任何操作。

有沒有一種可以接受的方法來處理這類事情?也許我只是無法繞過node.js/async。

+0

我認爲把console.log放在回調函數內部是使其工作的方法 – 2011-12-19 16:23:52

+0

@Daniel Elliott:我認爲你已經將這個例子稍微介紹了一下太字面 – Will 2011-12-19 16:26:46

回答

2

這就是所謂的回調

var delay = { 
    'time' : function(data, cb) { 
    this._connection().query('SELECT * FROM delay', function(err, result, fields) { 
     if (err) { 
     // return early to avoid else 
     return cb(err); 
     } 
     cb(null, result.length ? result[0].time : 60); 
    } 
    } 
} 

delay.time(null, function (err, time) { 
    console.log('Current Delay:' + time); 
}); 

注意,在內部函數return語句是沒用的。 return不會奇蹟般地在外部功能上調用return。這是因爲函數在它們的末尾有一個實現return undefined;