【问题标题】:Await all Mongo queries with Node.js使用 Node.js 等待所有 Mongo 查询
【发布时间】:2020-03-02 23:08:49
【问题描述】:

下面的代码有一个缺陷,因为我得到undefined的数组:

let filters = [];

async function getFilters(tiers) {

    return await Promise.all(

        tiers.map(async t => {
            let id = new ObjectId(t.filter);

            filters.push(
                await conn.collection('TierScheduleFilter').find({
                    _id: id
                }).toArray(function(err, filter) {
                    if (err || !filter) {
                        reject('no filter || error');
                    }

                    return filter;
                });
            );
        });
    );
}
await getFilters(tiers);
console.log(filters); // 4 filters => [ undefined, undefined, undefined, undefined ]

代码将检索除所有未定义值之外的所有过滤器。

【问题讨论】:

  • 这一切都在另一个异步函数中吗?你不能在异步函数之外声明awaits。
  • getFilters(tiers).then(x => console.log(filters))(注意:伪代码)之类的东西可能对你有用。由于您的代码不再同步,因此您的 console.log 会在其余代码有机会完成之前运行。
  • ... 如果您不强制 console.log 在 getFilters 调用完成后运行,它将始终打印 undefined 因为该内容尚未完成评估在代码中的那一点。

标签: node.js mongodb promise


【解决方案1】:

这似乎是一种正确的方法:

let filters = [];
    async function getFilters(tiers) {
        return await Promise.all(
                tiers.map(async t => {
                        let id = new ObjectId(t.filter);
                        try {
                            return await conn.collection('TierScheduleFilter').findOne({ _id: id })
                        } catch (e) {
                            return e;
                        }
                }))
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2018-03-22
    • 2020-10-17
    • 1970-01-01
    • 2018-05-02
    • 2016-07-23
    • 2020-05-17
    相关资源
    最近更新 更多