我是一名长期在学校工作的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的网站,以及许多视频,我想这确实是一种范式转变,因为我实际上没有完全了解。似乎应该很简单,但是我还没有克服一些不确定的障碍。任何帮助将不胜感激!
答案 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。
希望有帮助