用猫鼬异步保存多个文档

时间:2018-08-15 16:00:54

标签: node.js express asynchronous mongoose async-await

我正在使用mongoose.save()更新2个文档,但是据我所知,我需要使用async来确保所有文档都已执行

// array containing the 2 documents from db 
let schedules 
let newItem = {
   isActive: room.isActive,
   name: room.roomname
};

// adding new items to nested array
schedules[0].rooms.push(newItem);
schedules[1].rooms.push(newItem);

// saving / updating documents 


var total = schedules.length,
  result = [];

function saveAll() {
  var doc = schedules.pop();

  doc.save(function(err, saved) {
    if (err) throw err; //handle error

    result.push(saved);

    if (--total) saveAll();
    else {
      // all saved here
      res.json(result);
    }
  });
}

saveAll();

有关如何正确执行操作的任何说明

2 个答案:

答案 0 :(得分:1)

我们可以为此使用promise.all,但是我们需要将您的save函数更改为基于promise的函数

...

var total = schedules.length,
  result = [];

function saveAll() {
  const promises = schedules.map(schedule => save(schedule));
  return Promise.all(promises)
    .then(responses => {
      // all saved processes are finished
      res.json(responses);
    })
}

// convert callback `save` function to promise based
function save(doc) {
  return new Promise((resolve, reject) => {
    doc.save((err, saved) => {
      if (err) {
        reject(err);
      }

      resolve(saved);
    });
  });
}

如果您可以使用async/await,我们可以使saveAll功能更清洁

async function saveAll() {
  const promises = schedules.map(schedule => save(schedule));
  const responses = await Promise.all(promises);

  res.json(responses);    
}

希望有帮助

答案 1 :(得分:0)

使用承诺:

doc1.save().exec().then(
    data => {

        doc1.save().exec().then(
            data2 => console.log(data2)
        ).catch(err2 => console.log(err2))
    }
).catch(err1 => console.log(err1))
相关问题