javascript - 将条件异步调用转换为承诺
问题描述
我是一名资深的 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,还有一些视频,我想这真的是一种范式转变,因为我真的没有得到全貌。似乎它应该很简单,但是有一些我无法克服的未知障碍。任何帮助将非常感激!
解决方案
我会用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
for 处理程序,所以它总是返回承诺。
希望能帮助到你
推荐阅读
- sql - 在 Postgres 存储过程中创建插入查询的字符串数组并执行它们
- python - Openmesh,多边形三角剖分
- mysql - 使用 MySQL 在同一个表上多次左加入 2 个 id
- mysql - Mysql:选择一个表并限制每列值的行结果
- javascript - KaiOS 浏览器中 navigator.platform 的响应是什么?
- java - 在 api 响应中返回名为“未定义”的文件,spring boot
- c# - ASP.NET Core 2.2 中面临的问题“提供的 URI 方案 'https' 无效;应为 'http'。\r\n参数名称:通过”
- javascript - Javascript 文件在 ajax 导航中出现重复
- powershell - PowerShell Exchange Online cmdlet 返回一般异常
- mlflow - 如何使用零参数指定 mlflow MLproject?