首页 > 解决方案 > 将条件异步调用转换为承诺

问题描述

我是一名资深的 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,还有一些视频,我想这真的是一种范式转变,因为我真的没有得到全貌。似乎它应该很简单,但是有一些我无法克服的未知障碍。任何帮助将非常感激!

标签: javascriptnode.jspromisehapi

解决方案


我会用async/awaitas写它们

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

第四,我猜控制器方法必须是一个承诺?

没必要,我们使用asyncfor 处理程序,所以它总是返回承诺。

希望能帮助到你


推荐阅读