2013-12-08 158 views
0
User.prototype.isUnique = function() { 
    var result; 
    db.user.count({name:'abcdefg'}, function(err, count){ 
     console.log('the count is: ' + count); 
     result = count; 
    }); 
    return result; 
} 

該函數用於查明該用戶是否唯一,但返回結果總是'undefined',因爲db操作是異步的。我相信這是nodejs中的一個常見問題。 我該如何解決它?使mongoskin函數是異步同步

我嘗試使用承諾(https://npmjs.org/package/promise),但我沒有足夠的知識來理解他們的文檔。這是非常高級的開發人員。

你能幫我一些示例代碼嗎?我所需要做的就是使用mongoskin獲取count(),然後在此成員方法中返回結果。

謝謝!

+0

是否有任何wait_for()函數,我可以使用? –

回答

1

這不是一個普通的問題,它只是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包安裝)

+0

非常感謝!讓我試試回調方法。 –

+0

你知道如何使用諾言來解決這個問題嗎? (https://npmjs.org/package/promise) –

+0

@ NicolasS.Xu我添加了一個關於如何實現promise的例子。 – robertklep