-1

次のクエリでは、コールバック関数は決して起動しません。これは、アプリケーションの他の場所で問題なく動作するクエリのほぼそのままのクローンです。だから私は問題が何であるかを理解することはできません。誰かが私が間違ったことを見つけることができますか?

var imagesCollection = db.collection('Images');

    var Images = new Array();

    while(Images.length < quantity) {
        var random = Math.random();

            imagesCollection.find({
                "audioFiles.audioLanguage": audioLanguage,
                "random": {
                    $lte: random
                }
            }).limit(1, function(err, doc) {
                console.log('This never gets called');
                Images.push(doc);
            });

    }
    callback(err, Images);
4

2 に答える 2

0
quantity

var quantity = 10;  //declare variable to whatever number it needs to be
var imagesCollection = db.collection('Images');
var Images = new Array();

while(Images.length < quantity) {
//rest of code here...

それがあなたを助けるかどうか見てください。

于 2013-02-23T04:56:06.060 に答える
0

ループが実行されている限りコールバックを呼び出すことができず、十分な数のコールバックが実行されるとループが終了するwhileため、ループは事実上無限ループです。find

また、limitカーソルをドキュメントではなくコールバックに渡すため、代わりに使用する必要がありますfindOne

次のように書き直す必要があります。

var imagesCollection = db.collection('Images');
var Images = new Array();

for (var i=0; i<quantity; i++) {
    var random = Math.random();
    imagesCollection.findOne({
        "audioFiles.audioLanguage": audioLanguage,
        "random": {
            $lte: random
        }
    }, function(err, doc) {
        if (Images.push(doc) === quantity) {
            callback(err, Images);
        }
    });
}
于 2013-02-23T04:57:13.137 に答える