Почему обработка asyn c await занимает так много времени - PullRequest
1 голос
/ 25 мая 2020

Я создал свое приложение express с помощью async + await. Однако на выполнение sh этой задачи ушло так много времени.

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

Когда я продолжаю этот код, сразу же отображается строка A (console.log ("go к следующему шагу). После этого , Мне нужно ждать почти 1-2 минуты команд перенаправления.

Это проблема с ожиданием? Я уверен, что моя скорость inte rnet достаточно высока для загрузки любого файла.

1 Ответ

1 голос
/ 25 мая 2020

Вы предполагаете, что проблема заключается в процессе загрузки, но следуя сигнатуре вашего метода:

Car.findByIdAndUpdate

это скорее вызов обновления на основе локального хранилища данных.

await это не что иное, как синтаксис c сахар вокруг Promise (s), с помощью которого вы можете писать простые императивные операторы по старинке и не должны связывать завершение callback с #then.

Таким образом, вызов оператора await ed будет по-прежнему вызывать приостановку функции неблокирующим способом до тех пор, пока базовое обещание не завершится (либо выполнится, либо отклонится).

In другими словами, среда выполнения не блокируется, и дальнейшие запросы могут обрабатываться, но res.redirect(updated_car.url); не будет выполняться до тех пор, пока не будет разрешена функция Car.findByIdAndUpdate , которая, таким образом, должна быть профилирована на основе вашей системы хранения .

...