function sleep(t) {
return new Promise((resolve, reject) =>{
setTimeout(() => {
console.log('timeout!')
return resolve({isTimeout: true})
}, t);
});
}
function thirdPartyFunction(t) { // thirdPartyFunction can't be edited
return new Promise((resolve, reject) =>{
setTimeout(() => {
console.log('thirdPartyFunction completed!')
return resolve({success: true})
}, t);
});
}
function main() {
return new Promise(async(resolve, reject) => {
try {
let thirdPartyFunctionExecutionTime = Math.floor(Math.random() * 10) + 1;
thirdPartyFunction(thirdPartyFunctionExecutionTime * 1000, false).then( (r) => {
console.log('should not execute this if thirdPartyFunctionExecutionTime > timeout') // only goal
// other code which is not useful after timeout
});
const timeout = 3;
console.log(`thirdPartyFunctionExecutionTime: ${thirdPartyFunctionExecutionTime}, timeout - ${timeout}`)
await sleep(timeout * 1000, true);
throw 'stop main()'
// return
} catch (error) {
console.log('in catch')
return;
}
})
}
main()
超时是固定的。thirdPartyFunctionExecutionTime可能非常大(有时)在我的实际情况下,说30秒。我不希望在超时后后台运行的东西。
thirdPartyFunction承诺函数应在超时时停止执行。
1条答案
按热度按时间e5nqia271#
顺便说一句,这里有一个通用函数,可以添加一个超时,并带有取消选项。这个函数可以和任何承诺一起使用来添加一个超时。
如果promise表示的底层异步操作是可取消的,那么您可以提供一个cancel函数,如果异步操作先完成,这将自动清除计时器,使其不再继续运行。
然后,您可以在代码中使用它,如下所示:
如果您的异步操作能够在此操作超时时取消,则可以像这样支持它: