在继续该功能之前等待保存

时间:2017-12-29 17:11:40

标签: javascript node.js asynchronous mongoose synchronization

我有一个循环遍历一个用户数组,这个循环是异步的,我想要做的是为每个用户创建一个新文档并保存它并等待它保存然后继续下一个用户。我能够处理何时转移到下一个用户,所以我的问题是在保存新文档数据时。我正在使用mongoose保存方法。

主要功能是运行循环,这是一个示例。 注意:' async'是异步模块v2.6.0

async.forEach(users, (user, callback)=>{
    console.log(`Checking ${user.first_name}`);
    createNewDocument(user, (err)=>{
          if(!err) {
               console.log("New document created.");
               callback();
          }
    }, (err)=>{
        if(!err){
            console.log("All users were updated");
        }
    });
}

非异步方法

users.forEach((user)=>{
   console.log(`Checking ${user.first_name}`);
   createNewDocument(user, (err)=>{
        if(!err) {
               console.log("New document created.");
          }
   });
});

createNewDocument函数

function createNewDocument(user, callback)
{
      console.log("Creating a new doc...");
      let doc = new Doc();
      doc.save((err)=>{
         if(!err){
            console.log(`New doc created for user ${user.first_name}`);
            callback;
         }
      });
      console.log("Creating a new doc finished executing...");
}

所有内容都已执行,我在日志中得到的最后一件事就是为用户创建了新的文档...."为所有用户。 我已经尝试了很多东西,我尝试将doc.save放在一个承诺中,但是那个也没有用,不知道我现在该怎么办。

编辑:在转移到下一个用户之前创建新文档非常重要,我不想将它们添加到调用数组然后执行它,我需要检查上一个文件是否确实存在,并在下次循环进入时从中获取一些数据

1 个答案:

答案 0 :(得分:0)

多年来已经有过嵌套异步和正确错误处理的承诺。最近有asyncawait语法使promises看起来像C#代码,但重要的是要了解promises是如何工作的,因为该语法使用promises。

使用promises,您可以执行以下操作:

const createNewDocument = user =>
  new Promise(
    (resolve,reject) => {
      console.log("Creating a new doc...");
      let doc = new Doc();
      doc.save(
        err=>{
          console.log("Creating a new doc finished executing...");
          err
            ? reject(err)
            : resolve(`New doc created for user ${user.first_name}`)
        }
      );      
    }
  );

const saveDocuments = (users,processedSoFar=[]) => {
  if(users.length===0){
    return processedSoFar;
  }
  console.log(`Checking ${users[0].first_name}`);
  return createNewDocument(users[0])
  .then(
    result=>{
      console.log("New document created.");
      processedSoFar.push(users[0]);
      return saveDocuments(users.slice(1),processedSoFar);      
    }
  )
  .catch(
    err=>Promise.reject([err,processedSoFar])
  );
}

saveDocuments(users)
.then(
  result=>{
    console.log("Processed the following users:",users);
  }
)
.catch(
  ([err,processed])=>{
    console.log(
      "Something went wrong:",err,
      "Processed so far:",processed
    )
  }
)