【问题标题】:Chaining multiple Promises, loop over array using map and create mongoose document?链接多个 Promise,使用 map 循环数组并创建 mongoose 文档?
【发布时间】:2020-10-08 20:18:30
【问题描述】:

我正在使用getPeople() 从数据库中检索人员列表。一旦我以res 收到它们,我想准备将它们存储在我的本地 mongodb 如果它们不存在。有时res 中有重复的条目(对于一个id)。我的问题是它没有等待Person.create(pers) 完成,继续搜索这个id 是否已经在mongodb 中,找不到任何因为Person.create(pers) 仍在创建它并开始第二个Person.create(pers)..

this.getPeople()
  .then(res => {
    return Promise.all(res.map(pers => {
      pers.birthday = df(pers.birthday, 'dd.mm.yyyy')
      pers.pickedUp = false
      console.log(pers.id)
      return Person
        .find({ id: pers.id })
        .exec()
        .then(found => {
          if (found === undefined || found.length == 0)
            return pers
        })
        .then(pers => {
          return Person
            .create(pers)
            .then(console.log('created'))
            .catch(err => console.log(err))
        })
    }))
  }).catch(err => console.log(err))

我希望控制台输出是这样的:

940191
created
940191
created

相反,我得到了这个:

940191
940191
created
created

【问题讨论】:

    标签: node.js arrays mongoose promise


    【解决方案1】:

    那是因为 Promise.all 只是在等待你的所有承诺 mapping。它不保证承诺的解决顺序。

    如果您想按顺序处理res-array 的元素,您可以简单地将for .. of 循环与async/await 结合使用(请注意,这仍然需要一些错误处理,但它应该给你一些东西开始):

    async function getPeopleAndCreateIfNotExisting() {
        const persons = [];
        const res = await this.getPeople();
    
        for (const pers of res) {    
            pers.birthday = df(pers.birthday, 'dd.mm.yyyy');
            pers.pickedUp = false;
            console.log(pers.id)
            const found = await Person
                .find({ id: pers.id }).exec();
            if (found) {
                persons.push(pers);
            } else {
                persons.push(await Person.create(pers));
            }
        }
        return person;
    }
    

    【讨论】:

    • 这有帮助,谢谢。最后我做了不同的事情,但类似于你的建议。 :)
    • 太好了,乐于助人! :)
    猜你喜欢
    • 2016-11-28
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多