【问题标题】:Why does it take so long time to process the async await为什么处理异步等待需要这么长时间
【发布时间】:2020-09-12 09:55:04
【问题描述】:

我使用 async+await 创建了我的快速应用程序。 但是完成这项任务花了很长时间。

async.parallel(
  {
    cars: function (callback) {
      Car.findById(req.params.id).exec(callback);
    },
  },
  async (err, results) => {
    if (err) {
      return next(err);
    } else {
      var paramsDel = { Bucket: "test-s3-may", Key: results.cars.image_id };

      s3.deleteObject(paramsDel, function (err, file) {
        if (err) {
          return next(err);
        }
        s3.upload(params, function (err, data) {
          if (err) {
            return next(err);
          }
          console.log("go to the next step"); //lineA
        });
      });

      var updated_car = await Car.findByIdAndUpdate(req.params.id, car, {});
      res.redirect(updated_car.url);
    }
  }
);

当我继续执行此代码时,会立即显示 lineA(console.log("go to next step)。 之后,我必须等待近 1-2 分钟的重定向命令。

是等待的问题吗?我确信我的网速足以上传任何文件。

【问题讨论】:

  • 如果您希望它们等待upload 调用完成,您应该在console.log 调用之后立即移动以var updated_car = await Car.findByIdAndUpdate 开头的两行。

标签: node.js mongodb express amazon-s3 async-await


【解决方案1】:

您假设问题在于上传过程,但遵循您的方法签名:

Car.findByIdAndUpdate

这似乎是基于本地数据存储的更新调用。

await 只不过是Promise(s) 周围的语法糖,您可以用它以老式方式编写简单的命令式语句,而不必将完成callback 链接到#then

因此,awaited 语句调用仍将导致函数以非阻塞方式暂停,直到底层承诺完成(履行或拒绝)。

换句话说,运行时不会被阻塞,并且可以处理进一步的请求,但是直到 Car.findByIdAndUpdate 函数被解析 才会执行 res.redirect(updated_car.url);,因此需要根据您的存储系统进行分析

【讨论】:

  • 非常感谢,这有助于我理解问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多