当一个请求被发送到我的服务器端点时,我运行一个非阻塞的函数makeOrder
。
如果第一次使用setTimeout
失败,我想再次运行该函数,但我不确定是否应该在setTimeout
中使用async
,以确保它不会阻塞事件循环。
我现在正在做的是:
if (await makeOrder(order)) {
// order was successful
} else {
// try again in 5 minutes
setTimeout(async function() {
makeOrder(order);
}, 300000);
}
这是正确的吗?(makeOrder
根据成功与否返回true或false(
我想知道如果我使用async函数和just函数,如果有更多的请求到达我的端点,那么代码阻塞和不阻塞是否有区别?
async
关键字:
- 强制函数返回promise(由于
setTimeout
忽略返回值,因此这是无关的( - 允许您在函数中使用
await
关键字
它不会阻止阻塞代码被阻塞。
使用async
是您需要在函数内部管理承诺。在这种情况下,它没有其他用途。
您调用的唯一函数返回布尔值,而不是promise,因此您没有任何promise要管理。添加async
是毫无意义的(并且可能会让您或将来维护代码的其他人感到困惑(。
您可以使用递归来完成此操作。因为您可以在您的订单未成功后在特定的持续时间内重试。失败应该在catch块中,因为当您想在某些重试后停止操作时,这将是直观的。
function makeOrderWrapper(order, retry) {
return new Promise(function (resolve, reject) {
try {
if (retry < 0 )
reject();
makeOrder(order);
resolve();
} catch (exception) {
setTimeout(function () {
makeOrderWrapper(url, retry - 1).then(function () {
resolve();
});
}, 300000);
}
});
}
await makeOrderWrapper(order, 3)