簡體   English   中英

如何重寫異步函數(node.js,和尚)

[英]How to rewrite asynchronous function (node.js, monk)

我正在嘗試編寫一個異步函數,以便給我一個來自mongodb集合的隨機文檔。

var getRandDoc = function(){
    var db = monk('localhost/data');
    var coll = db.get('coll');

    coll.count({}, function(err, count){
        if (err) console.log(err);
        else {
            coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){
                if (err) console.log(err);
                else{
                    db.close();
                    return out[0]['name'];
                }
            });
        }
    });
}

在另一個文件中,我用類似以下內容的名稱來調用此函數:

console.log(test.getRandDoc());

undefined

我在做什么錯,我該如何解決?

這是通常的節點回調混亂。 如果您不想使用Promise,則getRandDoc()需要接受一個回調,然后在coll.find(...)方法中將其與結果一起調用。 所以像這樣:

var getRandDoc = function(cb){
    var db = monk('localhost/data');
    var coll = db.get('coll');

    coll.count({}, function(err, count){
        if (err) console.log(err);
        else {
            coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){
                if (err) return cb(err)
                else{
                    db.close();
                    return cb(null, out[0]['name']);
                }
            });
        }
    });
}

您可能也想傳回該錯誤,因此:

test.getRandDoc(function(err, name){
});

基於promise的版本將如下所示:

var getRandDoc = function(){
    var db = monk('localhost/data');
    var coll = db.get('coll');
    var deferred = Q.defer();

    coll.count({}, function(err, count){
        if (err) deferred.reject(err);
        else {
            coll.find({}, {limit:-1, skip:randomNum(0, count)}, function(err, out){

                if (err) deferred.reject(err);
                else{
                    db.close();
                    deferred.resolve((out[0]['name']);
                }
            });
        }
    });

    return deferred.promise;
    }

但這仍然不會給您直接的變量分配。 您最終會這樣稱呼它:

test.getRandDoc().then(function(res){}).fail(function(err){});

歡迎來到節點!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM