将条件异步调用转换为Promise

时间:2018-12-06 01:37:06

标签: javascript node.js promise hapi

我是一名长期在学校工作的JS工程师,在Promises方面挣扎。我们正在升级到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(无论是否进行异步调用)。第四,我猜控制器方法必须是一个承诺?

我已经审查(研究!)大概有十二个涵盖Promises的网站,以及许多视频,我想这确实是一种范式转变,因为我实际上没有完全了解。似乎应该很简单,但是我还没有克服一些不确定的障碍。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我将使用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作为处理程序,因此它将始终返回promise。

希望有帮助