如何等待承诺结束但超时



我有一个用Node编码的REST API.js并且有一条路由将NTFS权限应用于文件夹。请求可能需要 1 秒,但也可能需要几分钟(这取决于文件夹的大小)。

总而言之,如果应用权限的时间少于 5 秒,我想返回代码为 200 的值。

如果权限尚未完成应用,我想返回代码为 202 的值

...
inProgress = true;
ApplyRights()
.then(() => {
inProgress = false
}

// Here I want to return as fast inProgress = false otherwise wait a bit but max 5s
return ...;

我试图像这样用 setTimeout 等待一会儿:

const sleep = s => new Promise(resolve => {
setTimeout(resolve, s * 1000)
});
let nbCheck = 0;
while (inProgress && nbCheck < 5){
await sleep(1)
nbCheck++;
}

但是在我之前的承诺(ApplyRights)结束之前,不会调用setTimeout。 我在这里读到承诺在设置超时之前执行

所以,我试图找到一个没有setTimeout的解决方案,我尝试了这个:(我知道它不是很优雅)

let dateStop = Date.now() + 5 * 1000;
while (dateStop = Date.now() && inProgress){}
return ...;

但在这种情况下,ApplyRights 的 .then() 仅在 5s 结束时达到。

有没有办法让我的承诺应用权利发挥作用。如果作业需要时间,请最多等待 5 秒,然后再返回响应。如果作业很快,我想在不等待的情况下返回响应。

您可以使用Promise.race

Promise.race([ApplyRights(), sleep(5)]).then(result => {
if (result === undefined) { // Timeout of 5 seconds occurred 
// Some message to the user?
} else { // Got reply within 5 seconds
// Do something with the result
}
});

但是,请注意,这不会中断ApplyRights()的工作,最终可能仍然可以完成这项工作。

相关内容

  • 没有找到相关文章

最新更新