Javascript 将条件异步调用转换为承诺

Javascript 将条件异步调用转换为承诺,javascript,node.js,promise,hapi,Javascript,Node.js,Promise,Hapi,我是一名长期从事JS工作的老工程师,为承诺而挣扎。我们正在升级到HAPI v17,我很难理解如何转换现有代码以使其正常工作。问题是(一般而言): 我有一条HAPI v16路线,其功能如下: 基本上,路由处理程序检查一些内部标志以确定是否需要进行异步调用以检索某些字符串,然后将控制转发给控制器对象上的方法以满足请求 因此,我有一些问题:首先,是条件异步调用。其次,server.inject调用现在是等待调用(从HAPI v17开始)。第三,我需要从处理程序返回一个承诺(无论我是否进行异步调用)。第

我是一名长期从事JS工作的老工程师,为承诺而挣扎。我们正在升级到HAPI v17,我很难理解如何转换现有代码以使其正常工作。问题是(一般而言):

我有一条HAPI v16路线,其功能如下:

基本上,路由处理程序检查一些内部标志以确定是否需要进行异步调用以检索某些字符串,然后将控制转发给控制器对象上的方法以满足请求

因此,我有一些问题:首先,是条件异步调用。其次,server.inject调用现在是等待调用(从HAPI v17开始)。第三,我需要从处理程序返回一个承诺(无论我是否进行异步调用)。第四,我想控制器方法必须是承诺


我已经看过(研究过!)大概有十几个关于承诺的网站,还有一些视频,我想这真的是一个范式的转变,因为我还没有完全了解。看起来应该很简单,但有一些未知的障碍我还没有克服。任何帮助都将不胜感激

我将使用
async/await
as编写它们

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
,因此它将始终返回承诺


希望有帮助

文档是否表明从“处理者”处返回值(承诺或其他)是有益的?很可能Promission在这里对您没有好处。这与好处无关。HAPI v17要求处理程序返回一个承诺。你能链接到说明这一点的文档吗?我已经看过了,找不到任何路由处理程序返回字符串或JS普通对象以外的任何东西的例子。这里有几个:,,异步不是一个隐含的承诺吗?这个建议对我有效。谢谢如果有更好的建议,我会把这个问题留待讨论。清理我们的代码还需要许多其他的代码更改,因此这可能最终会减少为一个带有(request,h)参数的处理程序,以处理其中的条件异步操作。但这一解决方案使其在过渡时期起作用。
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);      
    }
});