【问题标题】:Wait for save before continuing with the function在继续使用该功能之前等待保存
【发布时间】:2018-06-10 02:15:42
【问题描述】:

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

主函数正在运行循环,这里是一个示例。 注意:'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 放入一个 Promise 中,但效果不佳,不知道我现在应该做什么。

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

【问题讨论】:

  • “我想做的是为每个用户创建一个新文档并保存它,然后等待它保存,然后转到下一个用户”。那你为什么要使用异步循环呢?异步的全部意义在于不要等待。
  • 我之前使用了非异步循环,它导致了同样的问题,直到有人建议使用异步,这就是我的确切观点,异步不等待,他们说回调会控制它。
  • "callbacks" 实际上与异步行为无关。有很多使用回调的同步函数。原生 Array.forEach 使用一个。
  • @gforce301 我也用过,我编辑发布并包含该功能,您可能想看看它,它仍然会导致完全相同的问题。
  • 看来doc.save 也是异步的,这就是它仍在发生的原因。

标签: javascript node.js asynchronous mongoose synchronization


【解决方案1】:

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

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

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
    )
  }
)

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2020-12-24
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多