4
mturk_ops.block = function(callback){


mongodb.collection(collectionName, function(err, collection){

    collection.distinct('workerId',function(err,result){
        var result1 = [];
        console.log(result.length);
        for(var i=0; i< result.length;i++){

            console.log(result[i]);

          result1[result[i]] =  collection.count({
                'workerId':result[i],
                "judgementStat" : "majority"
            },function(err, count){
                //  console.log(count);
              //  globals.push(count);
                return count ;
                // console.log( worker + ' majority : ' + count);

            });

        }

    console.log(result1);
    });


});

}

ここで「result1」を印刷しようとしていますが、常に未定義の値を持つ配列を印刷しています。「result1」は、コールバック関数の範囲外に割り当てられた配列です。

4

1 に答える 1

9

非同期コールバックから値を返すことはできません。通常、コールバックは、それが宣言された関数が戻った後、しばらくしてから実行されます (その関数は、非同期メソッドを呼び出した後も実行を続けます)。コールバック関数が戻る場所がありませ。簡単な例を次に示します。

function doSomething() {
    var x = 10;
    doSomethingAsynchronous(function () {
        // This is a callback function
        return 30; // Where would I return to?
    });
    x += 10; // Execution continues here as soon as previous line has executed
    return x; // doSomething function returns, callback may not have run yet
}

非同期メソッドの結果に依存する必要がある場合は、それを必要とするコードをコールバックに移動する必要があります。

于 2012-11-19T11:20:49.757 に答える