【问题标题】:JavaScript - async/await not waiting for promise to resolve [duplicate]JavaScript - 异步/等待不等待承诺解决[重复]
【发布时间】:2018-04-17 18:04:15
【问题描述】:

我想使用 Mongoose 的批量操作来更新事务。对于我的每笔交易,我想在一个循环中处理它们,并且在那个循环中我需要使用一个承诺。在该承诺解决后,我想将 upsert 添加到批量中。

我的问题是,尽管我 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
    });

【问题讨论】:

  • 什么是transactions.forEach?它如何处理其回调返回的承诺?
  • transactions 只是一个交易对象数组。我用forEach 遍历数组
  • 那是个问题:-)

标签: javascript mongoose async-await es6-promise bulk


【解决方案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
    });

【讨论】:

  • 正确,但没有必要有问题。这并不能解决问题
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2018-02-03
  • 2018-03-05
  • 2019-04-29
  • 2021-12-26
相关资源
最近更新 更多