将条件异步调用转换为 promise
Converting conditional async call to promise
我是一名老派的 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 调用现在是一个 await 调用(从 HAPI v17 开始)。第三,我需要 return 来自处理程序的 Promise(无论我是否进行异步调用)。第四,我猜控制器方法必须是一个承诺?
我已经查看(研究!)了大概十几个涵盖 Promises 的网站和一些视频,我想这真的是一种范式转变,因为我真的没有了解全貌。看起来应该很简单,但有一些我无法克服的不明障碍。任何帮助将不胜感激!
我将使用 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);
}
});
Fourth, I guess the controller method has to be a promise?
不需要,我们使用 async
作为处理程序,因此它总是 return promise。
希望对您有所帮助
我是一名老派的 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 调用现在是一个 await 调用(从 HAPI v17 开始)。第三,我需要 return 来自处理程序的 Promise(无论我是否进行异步调用)。第四,我猜控制器方法必须是一个承诺?
我已经查看(研究!)了大概十几个涵盖 Promises 的网站和一些视频,我想这真的是一种范式转变,因为我真的没有了解全貌。看起来应该很简单,但有一些我无法克服的不明障碍。任何帮助将不胜感激!
我将使用 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);
}
});
Fourth, I guess the controller method has to be a promise?
不需要,我们使用 async
作为处理程序,因此它总是 return promise。
希望对您有所帮助