由于异步调用,引用数组失败

时间:2017-07-30 06:41:21

标签: javascript node.js asynchronous mongoose

我正在尝试引用MongoDB中的文档。我试图在实际调用数据库之前首先创建我想要插入的文档。我用过

const venues = [
  new Venue({ name: 'A' }),
];

const events = [
  new Event({
    name: 'B',
    venue: venues[0]._id
  })
];

但似乎venues[0]._idnull

如果我使用console.log(venues),我会得到我想要的数组,所以它不应该说null

我担心会因为异步调用而发生这种情况,即const venues = ...行在启动const events = ...代码行之前没有完成。

在下一行引用数组之前,我该怎么做才能确保const venues = ...完成?

修改

实际上,如果我使用console.log(events),我发现它可以正常工作。

但是当我使用

Promise.all([Venue.create(venues), Event.create(events)]).then(() => { .. });

场地变为null

1 个答案:

答案 0 :(得分:0)

您的代码缺少实际将Venue对象保存到数据库的部分(意味着调用MongoDB' insert函数)。除非您保存它,或手动提供_id属性,否则该属性将保持未定义状态。这与同步\异步代码无关。

编辑:

当您将venues[0]._id分配给新Event对象的venue属性时,它尚未定义,因为您尚未调用create函数。你应该做的是:

  1. 在数据库中创建Venue对象
  2. 完成后,分配新创建的_id
  3. 等待完成可以通过多种方式完成:

    1. 使用回叫
    2. 使用Promise的.then(...)功能
    3. await承诺
    4. 这一切都取决于你的口味和你正在使用的工具。

      最重要的是,请注意Promise.all会立即执行数组中的所有承诺,因此在这种情况下您无法使用它。