在循环结束时等待findOneAndUpdate

时间:2017-11-11 13:46:43

标签: node.js mongodb mongoose

names.forEach((o, i) => {
                Name.findOneAndUpdate({name: o.name}, o, {upsert: true, 'new': true})
                .then(result => {
                    res.json(result);
                })
            })

我不能在上面的循环中做res.json,如何处理这种情况?我想找到名字是否存在,如果存在则不做任何事情,否则插入名称。

2 个答案:

答案 0 :(得分:1)

首先要读这个。

What is the difference between synchronous and asynchronous programming (in node.js)

你把它混合起来。

要修复您的代码,您可以使用promises ...

例如

do {
    let elements = try JSONDecoder().decode([ResponseElement].self, from: data)
    let employees = elements.filter { $0.type == .employee }.flatMap(Employee.init)
    let employers = elements.filter { $0.type == .employer }.flatMap(Employer.init)

    print(employees.count)
    print(employers.count)
} catch {
    print("Something bad has happened :\(error)")
}

现在你可以运行循环并使用promise all

function runUpdate(obj) {
   return new Promise((resolve, reject) => {
     //you update code here

    Name.findOneAndUpdate({name: obj.name}, {$setOnInsert: obj}, { upsert: true })
      .then(result => resolve())
      .catch(err => reject(err))
    });
  });
}

最后

let promiseArr = [];
names.forEach(obj => promiseArr.push(runUpdate(obj)));

关于不更新存在的文件。看一下这个。 https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/#op._S_setOnInsert

希望这有帮助。

答案 1 :(得分:0)

这对我有用

const promises = names.map(async obj => 
   await Name.findOneAndUpdate(
      {name: obj.name}, 
      obj, 
      {upsert: true, 'new': true}
   )
)
await Promise.all(promises)

console.log('test')

如果运行此代码,您将看到“测试”仅在诺言之后出现。