如何等待承诺结束但超时
How to wait end of promise but with timeout
我有一个用 Node.js 编码的 REST API,并且有一种方法将 NTFS 权限应用于文件夹。请求可能需要 1 秒,但也可能持续几分钟(这取决于文件夹的大小)。
总而言之,如果申请权利的时间少于 5 秒,我想 return 代码为 200 的值。
如果权利还没有申请完我想return代码为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
之前执行
所以,我试图找到一个没有 setTimeout 的解决方案,我尝试了这个:(我知道这不是很优雅)
let dateStop = Date.now() + 5 * 1000;
while (dateStop = Date.now() && inProgress){}
return ...;
但在这种情况下,ApplyRights 的.then() 仅在5s 结束时到达。
有没有办法让我的承诺 ApplyRights 发挥作用。如果这项工作需要时间,请在 return 响应之前等待最多 5 秒。如果工作很快,我想 return 无需等待即可回复。
您可以使用 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()
的工作,后者最终可能仍会完成工作。
我有一个用 Node.js 编码的 REST API,并且有一种方法将 NTFS 权限应用于文件夹。请求可能需要 1 秒,但也可能持续几分钟(这取决于文件夹的大小)。
总而言之,如果申请权利的时间少于 5 秒,我想 return 代码为 200 的值。
如果权利还没有申请完我想return代码为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 结束时到达。
有没有办法让我的承诺 ApplyRights 发挥作用。如果这项工作需要时间,请在 return 响应之前等待最多 5 秒。如果工作很快,我想 return 无需等待即可回复。
您可以使用 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()
的工作,后者最终可能仍会完成工作。