如何等待承诺结束但超时

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() 的工作,后者最终可能仍会完成工作。