【问题标题】:Await code not being executes after await even if I resolve a promise on aggregation即使我解决了聚合承诺,等待代码也不会在等待后执行
【发布时间】:2020-07-26 01:19:40
【问题描述】:

我一直在努力争取承诺,但我还没有找到解决问题的方法。

我想做什么;

我正在从 MongoDB 获取聚合数据并将其值分配给类对象。 这是聚合的一段代码;

 static get(email: BaseUser['email']) {
    const query = { email: email }
    return new Promise(resolve => {
        const data = this.model.aggregate([
            {
                $match: query
            }, {
                $project:
                {   // Get the last element of the array which is previous week's data
                    d1: { $arrayElemAt: ["$data.myData1", -1] },
                    d2: { $arrayElemAt: ["$data.myData2", -1] },
                    d3: { $arrayElemAt: ["$data.myData3", -1] },
                    email: email
                }
            }
        ])
        resolve(data)
    })
}

我在这里调用了上面的函数;

  private static async set(email: string) {
    console.log(1)
    const data = await MongooseBusiness.get(email); // below code won't work
    console.log(data, 'data')
    const oldCumulativeCounts = data[0];
    console.log(4)
    return new Promise(resolve => resolve('a piece of data'));
}

就像我在上面的评论中所说,等待之后的代码不起作用。就像它甚至不存在一样。即使我在 get 函数中解决了一个承诺。有什么帮助吗?

【问题讨论】:

  • this.model.aggregate 是异步函数吗?
  • 是的。这是猫鼬的默认聚合函数。
  • 顺便说一句,如果我将回调设置为get,那么回调也不会被执行

标签: node.js typescript mongoose async-await es6-promise


【解决方案1】:

据我所知,this.model.aggregate() 正在返回一个 Promise,这意味着您的方法 get 正在返回一个 Promise<Promise<...>>

您可以简单地返回 this.model.aggregate() 而不是 new Promise

 static get(email: BaseUser['email']) {
    const query = { email: email }
    return this.model.aggregate([
            {
                $match: query
            }, {
                $project:
                {   // Get the last element of the array which is previous week's data
                    d1: { $arrayElemAt: ["$data.myData1", -1] },
                    d2: { $arrayElemAt: ["$data.myData2", -1] },
                    d3: { $arrayElemAt: ["$data.myData3", -1] },
                    email: email
                }
            }
        ])
}

【讨论】:

  • 感谢您的回答,但没有奏效。其实我已经在第一次尝试过你的答案然后我在 SO 上看到了一些答案然后我转换了new Promise... 版本。
  • 也许你可以试试this.model.aggregate(...).then(data => resolve(data))。这将再次“解包” Promise...
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2021-06-23
  • 2020-06-20
相关资源
最近更新 更多