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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在继续该功能之前等待保存相关的知识,希望对你有一定的参考价值。

我有一个循环遍历一个用户数组,这个循环是异步的,我想要做的是为每个用户创建一个新文档并保存它并等待它保存然后转移到下一个用户。我能够处理何时转移到下一个用户,所以我的问题是在保存新文档数据时。我正在使用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放在一个承诺中但是效果不好,不知道我现在应该怎么做。

编辑:在继续下一个用户之前创建新文档对我很重要,我不想将它们添加到调用数组然后执行它,我需要检查前一个文档是否真的存在并采取一些循环进入下一次的数据

答案

多年来已经有嵌套异步和正确错误处理的承诺。最近有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
    )
  }
)

以上是关于在继续该功能之前等待保存的主要内容,如果未能解决你的问题,请参考以下文章

节点在继续之前等待异步功能

等待 AJAX,然后继续通过单独的功能

使用此代码,PHP 会在继续之前等待吗?

Javascript:在循环继续之前等待函数结束[重复]

函数在继续循环之前不等待条件完成

Angular2 Observable - 在继续之前等待多个函数调用