Преобразование условного асинхронного вызова в обещание - PullRequest
0 голосов
/ 06 декабря 2018

Я давний инженер JS старой школы, борюсь с Обещаниями.Мы обновляем HAPI v17, и мне сложно понять, как преобразовать существующий код, чтобы он работал.Вот проблема (обычно):

У меня есть маршрут HAPI v16, который выполняет что-то вроде:

  server.route({
        method: 'GET',
        path: '/product/prd-{productId}/{filename*}',
        handler: function (request, reply) {
          var productId = encodeURIComponent(request.params.productId);
          if( /*someCondition*/ ){
              server.inject('/staticmessages/product', function (SCResponse) {
                  if (SCResponse.statusCode === 200 && SCResponse.statusMessage === 'OK') {
                      productStaticContent = JSON.parse(SCResponse.payload).messages;
                  }
                  PDPController.renderPDP(request, reply, productId, productStaticContent);
              });
          }
          else {
              PDPController.renderPDP(request, reply, productId, productStaticContent);
          }
        }
    });

В основном, обработчик маршрута проверяет некоторые внутренние флаги, чтобы определитьесли ему нужно выполнить асинхронный вызов для получения некоторых строк или нет, то перенаправляет управление методу объекта контроллера для выполнения запроса.

Итак, у меня есть ряд проблем: во-первых, это условнаяасинхронный вызов.Во-вторых, вызов server.inject теперь является ожиданием (по состоянию на HAPI v17).В-третьих, мне нужно вернуть Promise от обработчика (независимо от того, делаю я асинхронный вызов или нет).В-четвертых, я полагаю, что метод контроллера должен быть обещанием?

Я рассмотрел (изучил!), Вероятно, дюжину веб-сайтов, посвященных Обещаниям, и ряд видео, и я полагаю, что это действительно смена парадигмы, поскольку яЯ действительно не получаю полную картину.Похоже, все должно быть просто, но есть неопознанное препятствие, которое я просто не преодолеваю.Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 06 декабря 2018

Я напишу их, используя async/await как

server.route({
    method: 'GET',
    path: '/product/prd-{productId}/{filename*}',
    handler: async function (request, reply) { // put async
      var productId = encodeURIComponent(request.params.productId);
      const condition = await checkCondition(); // put await 

      if (condition) {
        const SCResponse = await server.inject('/staticmessages/product'); // put await
        if (SCResponse.statusCode === 200 && SCResponse.statusMessage === 'OK') {
          productStaticContent = JSON.parse(SCResponse.payload).messages;
        }
        return PDPController.renderPDP(request, reply, productId, productStaticContent); // add return
      }

      return PDPController.renderPDP(request, reply, productId, productStaticContent);      
    }
});

В-четвертых, я полагаю, что контроллер должен быть обещанием?

Не обязательно,мы используем async для обработчика, поэтому он всегда возвращает обещание.

Надеюсь, это поможет

...