我已经花了6个小时试图弄清楚如何在NodeJS中做到这一点.

我正在将NodeJS与Express和MongoDB一起使用.

我有一个数据库,有两个集合,即.列表和类别.每个 list 都有一个"CATEGORY",它是映射到Categories集合中的一个类别的ID.

我想要做的是,获取所有 list ,然后遍历所有 list ,并使用类别id从Categories集合中获取类别标题.

这就是我得到所有房源的原因:

const listings_raw = [];

await db.collection("listings").find().forEach(listing => listings_raw.push(listing));

上面的代码运行良好.我现在遇到的麻烦是:

const listings = [];

listings_raw.forEach(async listing => {
    const category_id = listing.category;

    const category_title = await db.collection('categories').findOne({_id: objectId(category_id)});

    listing.category_title = category_title;

    listings.push(listing);
});

response.send(listings);

listings_raw.forEach完成之前,response.send(listings);被执行.

我想发送的数据后,所有的 list 已经填充了类别标题.

在花了6个小时后,我想出了下面的黑客,我肯定这是令人讨厌的!

const listings_raw = [];

const em = new events.EventEmitter();

await db.collection("listings").find().forEach(listing => listings_raw.push(listing));

const listings = [];

let counter = 0;

listings_raw.forEach(async (listing) => {
    const category_id = listing.category;

    const category = await db.collection('categories').findOne({_id: objectId(category_id)});

    listing.category_title = category.title;

    listings.push(listing);

    if (counter === listings_raw.length - 1) {
        em.emit('listings:processing:done');
    }

    counter++;
});

em.on('listings:processing:done', () => {
    response.send(listings);
});

请问,有没有人可以解释或指导我应该如何用JavaScript来完成这项工作?

基本上,我不知道如何知道所有的promise 是否都得到了解决.

谢谢!

推荐答案

listings_raw.forEach函数在数组上同步执行,即使您随后在该数组中执行异步操作.

Promise.all会让你以await来换取一系列promise 的结果.因此,您可以.mappromise 数组的列表which返回更新的列表.

const listings = await Promise.all(listings_raw.map(async listing => {
    const category_id = listing.category;

    const category_title = await db.collection('categories').findOne({_id: dependencies.objectId(category_id)});

    listing.category_title = category_title;

    return listing;
});

response.send(listings);

Javascript相关问答推荐

Promise.all立即跳到那时,而不是调用所有Promise

错误:找不到react-redux上下文值;请确保该组件包装在React原生Expo应用程序中的提供者中

如何在dataTables PDF输出中正确渲染字形?

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

Vega中的模运算符

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

setcallback是什么时候放到macrotask队列上的?

使用JQuery单击元素从新弹出窗口获取值

Angular 中的类型错误上不存在获取属性

在运行时使用Next JS App Router在服务器组件中运行自定义函数

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

向数组中的对象添加键而不改变原始变量

在不删除代码的情况下禁用Java弹出功能WordPress

每次重新呈现时调用useState initialValue函数

是否可以将异步调用与useState(UnctionName)一起使用

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

FireBase FiRestore安全规则-嵌套对象的MapDiff

重新呈现-react -筛选数据过多