這不是一個普通的問題,它只是Node的工作原理以及你必須習慣處理的事情。
最簡單的解決方案(也是一個非常常見的解決方案)是從調用代碼提供回調函數。每當異步動作完成該函數將被調用:
User.prototype.isUnique = function(callback) {
db.user.count({name:'abcdefg'}, function(err, count){
console.log('the count is: ' + count);
callback(err, count);
});
}
// in your calling code:
user.isUnique(function(err, count) {
if (err) ...; // TODO: handle error
...
});
這也是常見的節點有回調函數接受至少一個參數,它包含一個錯誤對象,如果發生錯誤,或者null
如果一切正常。
在上面的代碼中,我將在調用db.user.count
期間可能發生的任何錯誤傳遞給回調函數。這取決於調用代碼來處理任何錯誤。
處理異步代碼有幾種選擇。就像你提到的那樣,其中一個就是使用承諾。還有像streamline這樣的解決方案,它使異步代碼看起來像一樣,但它需要您「編譯」您的代碼(儘管這也可以在運行時完成),然後才能使用它。
編輯:,如果你想使用的承諾,您可以使用此:
var Promise = require('promise');
User.prototype.isUnique = function() {
return Promise(function(resolve, reject) {
db.user.count({name:'abcdefg'}, function(err, count){
if (err) {
console.log('an error occurred:', err);
reject(err);
} else {
console.log('the count is:', count);
resolve(count);
}
});
});
};
// in your calling code:
user.isUnique().then(function(count) {
...
}, function(err) {
...
});
(這需要promise
包安裝)
是否有任何wait_for()函數,我可以使用? –