2017-11-05 11 views
0

ここで私のデータベースの一部のドキュメント(MongoDB)を更新しようとしているコード forループを使用しています。しかし、私はループが完了した後、次のコードを実行したい、たとえば、 、私はいくつかの変数を使用したいループの中で計算された後に計算されます。 コールバック、約束などを使って、どうすればいいですか?ノードjs、ループ後にコード同期を実行する方法

numPktUpdated = 0; 
for (key in InvoicesPUT) { 
     Invoice.findOneAndUpdate({ InvoiceNumber: InvoicesPUT[key].InvoiceNumber }, InvoicesPUT[key]).exec() 
     .then((doc) => { 
      console.log("Update Succeeded") 
      numPktUpdated = numPktUpdated + 1; 
     }) 
     .catch((err) => { 
      return resp.send(JSON.stringify({ 
      "status": "error", 
      "message": "DB Error while Updating: Wrong Packet" 
      })); 
      console.log(err); 
    }) 
} 
resp.send(numPktUpdated); 

ここでnumPktUpdated = 0がクライアントに送信されますが、ループ後の実際の値は他のものです。

ありがとうございました。

+0

は、アクションを実行するためにasync.series' 'を見て – ValLeNain

答えて

1

でそれを実行し、関数にコードを配置するようにしてください:

Promise.all(InvoicesPUT.map(InvoicePUT => { 
    return Invoice.findOneAndUpdate({ 
     InvoiceNumber: InvoicePUT.InvoiceNumber 
    }, InvoicePUT).exec() 
    .then(doc => { 
     console.log("Update Succeeded"); 
     numPktUpdated += 1; 
    }) 
})) 
.catch(err => { 
    return resp.send(JSON.stringify({ 
     "status": "error", 
     "message": "DB Error while Updating: Wrong Packet" 
    })); 
    console.log(err); 
}) 
.then(() => { 
    // What you want to do after the loop ... 
}) 
1

はあなたがPromise.all()でこれを行うことができるはず非同期

async function forLoopFunction(args){//here is a for loop 
    } 

    let ret = await forLoopFunction(args); 
0

あなたはノードの古いバージョンを使用している場合v7.6は、async/awaitパターンをサポートしています。簡単に使用できます。Promise

function updateDocs() { 
    return new Promise(function(resolve, reject) { 
     numPktUpdated = 0; 
     for (key in InvoicesPUT) { 
       Invoice.findOneAndUpdate({ InvoiceNumber: InvoicesPUT[key].InvoiceNumber }, InvoicesPUT[key]).exec() 
       .then((doc) => { 
        console.log("Update Succeeded") 
        numPktUpdated = numPktUpdated + 1; 
        resolve(numPktUpdated); 
       }) 
       .catch((err) => { 
        console.log(err); 
        reject(err); 
        return resp.send(JSON.stringify({ 
         "status": "error", 
         "message": "DB Error while Updating: Wrong Packet" 
        }));      
      }) 
     } 
    }); 
} 


updateDocs().then(function(numPktUpdated) { 
    resp.send(numPktUpdated); 
}) 
.catch(function(err) { 
    // handle error 
}); 
0

おかげで、それはちょうどマイナーな変更で働いていた:いくつかの約束は戻ってきた後

Promise.all(InvoicesPUT.map(invoice => { 
       return Invoice.findOneAndUpdate({InvoiceNumber: invoice.InvoiceNumber}, invoice).exec() 
       .then((doc) => { 
        console.log("Update Succeeded") 
        numPktUpdated = numPktUpdated + 1; 
       }) 

      })) 
      .catch((err) => { 
       return resp.send(JSON.stringify({ 
        "status": "error", 
        "message": "DB Error while Updating: Wrong Packet" 
       })); 
       console.log(err); 
      }) 
      .then((resolve) => { 
       return resp.send(JSON.stringify({ 
        "status": "succed", 
        "LastSavedGUID": 654323, 
        "SyncDate": 1, 
        "pagenumber": numPktUpdated 
       })); 
      }) 
関連する問題