繁体   English   中英

用猫鼬异步保存多个文档

[英]async save multiple document with mongoose

我正在使用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();

任何解释如何正确执行

我们可以为此使用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);    
}

希望能帮助到你

使用承诺:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM