2017-11-05 19 views
0

トランザクションを更新するためにMongooseの一括操作を使用したいと思います。私のトランザクションごとに、それらをループで処理したいと思っています。そのループの中で私は約束を使用する必要があります。その約束が解決した後、私は大量にupsertを追加したい。JavaScript - async /約束を待つことを約束していません

ここで私の問題は、すべての約束が完了するまで私がawaitですが、約束が解決される前に機能の最後にバルクが実行されるということです。何が間違っているのですか?これをどうやって解決できますか?

const bulkTransactions = Transaction.collection.initializeUnorderedBulkOp(); 

    transactions.forEach(async (transaction: any) => { 

     // do some suff, fill transaction_data 

     await Utils.processTransactionType(transaction).then((action: any) => { 

      if (action) { 
       // do other stuff 
      } 

      bulkTransactions.find({_id: hash}).upsert().replaceOne(transaction_data); 

     }).catch((err: Error) => { 
      // log error 
     }); 
    }); 

    await bulkTransactions.execute().catch((err: Error) => { 
     // log error 
    }); 
+0

を 'transactions.forEach'はどのようなものですか?そのコールバックによって返される約束をどのように扱いますか? – Bergi

+0

トランザクションは単なるトランザクションオブジェクトの配列です。私は '' forEach'''で配列をたどります。 – phoebus

+0

これは問題です:-) – Bergi

答えて

-1

私の知る限りでは、awaitを使用しているとき、あなたはもはやthen戻り値を使用します。

const bulkTransactions = Transaction.collection.initializeUnorderedBulkOp(); 

    transactions.forEach(async (transaction: any) => { 

     // do some suff, fill transaction_data 

     let action = await Utils.processTransactionType(transaction); 

     if (action) { 
      // do other stuff 
     } 

     bulkTransactions.find({_id: hash}).upsert().replaceOne(transaction_data); 


    }); 

    await bulkTransactions.execute().catch((err: Error) => { 
     // log error 
    }); 
+0

真実ですが、問題はありません。そして、これは問題を解決しません – Bergi

関連する問題