1

複数のエントリを作成/更新するために、forEach ループで findOneAndUpdate を使用しています。

作成または更新したすべてのオブジェクト ID の配列を返すようにしたいと考えています。

ループ中に配列にデータが追加されているのがわかりますが、ループを抜けると配列は空になります。

配列に値を設定しないでください。

これが私のコードです。

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

softwareArray.forEach(function(software){
    Software.findOneAndUpdate(
        {
            Name: software
        },
        {
            Name: software
        },
        {upsert:true},
        function(err, rows){
            updatedArray.push(rows._id);
            console.log(updatedArray); //This has data in it....
        }
    );
});
console.log(updatedArray); //This has no data in it...

編集:チアゴの作業変更で更新

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

loopSoftware(softwareArray, function(updatedArray){
    console.log(updatedArray);
    //carry on....
}

function loopSoftware(input, cb){
    var returnData = [];

    var runLoop = function(software, done) {
        Software.findOneAndUpdate(
            {Name: software},
            {Name: software},
            {upsert:true},function(err, rows){
                returnData.push(rows._id);
                done()
            }
        );
    };

    var doneLoop = function(err) {

        cb(returnData);

    };

    async.forEachSeries(input, runLoop, doneLoop);
}
4

2 に答える 2

0

もちろん、これは起こります - Node 上の他のネットワークと同様に、非同期です!

これは、findOneAndUpdate操作に指定したコールバックがコードに到達した時点でまだ実行されていないことを意味しconsole.log(updatedArray);ます。

この一般的な問題を回避するには、 Qを参照してください。

于 2013-06-06T11:50:18.780 に答える