2016-08-26 13 views
6

dizisi yerine bir söz verir. Şu anda düğüm 4.3.2 ve mongo 2.6 kullanmaktadır. Tam bir koleksiyona (koleksiyonda şu anda üç belge) ulaşmaya çalışıyorum. Bu kodu kullandığımda bir sorunla karşılaşıyorum. Bu kod updateTimes tun edilircursor.toArray()

function checkUpdateTime(last_updated){ 
    var collection = db.collection(last_updated); 
    collection.insert({a:1}); 
    updateTimes = collection.find({a:1}).toArray(); 
} 
var updateTimes = []; 
checkUpdateTime('last_updated'); 
console.log(updateTimes); 

bir söz değil ben umuyordum dizidir. Amaç, diziyi düzenlemek ve daha sonra koleksiyona geri eklemektir. Ekleme ifadesi işe yarıyor, ancak belgelerin geri alınması beklediğim gibi davranmıyor. Bu kodun birkaç versiyonunu denedim ama zar atmam.

Sanırım bir sözün neden iade edildiğini merak etmek bana bağlı mı? yapmadığınızda arayan

bir söz döndürerek arayan

  • geçti olsun geri aramaları yoluyla

    • :

  • cevap

    9

    MongoDB sürücüsü asenkron işlemleri işlemek için iki seçenek sunar Durumunda olduğu gibi, bir geri arama geçmek, bir söz vereceğiz.

    Burada bir seçim yapmalısınız. Seçemeyeceğiniz bir seçenek "bu kodu senkronize olarak çalıştır" olsa da.

    Ben vaatlerde tercih: Her zaman biraz daha süslü gidip Promise.coroutine gibi bir şey kullanabilirsiniz

    function checkUpdateTime(last_updated){ 
        var collection = db.collection(last_updated); 
        return collection.insert({ a : 1 }) // also async 
            .then(function() { 
            return collection.find({ a : 1 }).toArray(); 
            }); 
    } 
    checkUpdateTime('last_updated').then(function(updateTimes) { 
        console.log(updateTimes); 
    }); 
    

    , kodunuzu yapacak bakmak biraz (o olmasa bile) daha senkron:

    Babel kullanarak
    const Promise  = require('bluebird'); 
    const MongoClient = require('mongodb').MongoClient; 
    
    let checkUpdateTime = Promise.coroutine(function* (db, last_updated){ 
        let collection = db.collection(last_updated); 
        yield collection.insert({ a : 1 }); 
        return yield collection.find({ a : 1 }).toArray(); 
    }); 
    
    Promise.coroutine(function *() { 
        let db = yield MongoClient.connect('mongodb://localhost/test'); 
        let updateTimes = yield checkUpdateTime(db, 'foobar'); 
        console.log(updateTimes); 
    })(); 
    

    Veya async/await:

    const MongoClient = require('mongodb').MongoClient; 
    
    async function checkUpdateTime(db, last_updated) { 
        let collection = db.collection(last_updated); 
        await collection.insert({ a : 1 }); 
        return await collection.find({ a : 1 }).toArray(); 
    } 
    
    (async function() { 
        let db = await MongoClient.connect('mongodb://localhost/test'); 
        let updateTimes = await checkUpdateTime(db, 'foobar'); 
        console.log(updateTimes); 
    })(); 
    
    +0

    '" sen "' seçeneğini seçemezsiniz. Yapabilir. Async/await ile. –

    +0

    @vp_arth hala, bunu senkronize etmeyecek (ipucu isminde, "async" ;-)). Olsa da, _look_ olabilir, bu yüzden bir örnek olarak ekledim: D – robertklep