如果内部函数已完成处理,如何取消setTimeout?

How to cancel setTimeout if function inside has done processing?

我有一个执行某些处理的函数 A

A().then({  
    check if error saveStatus(failure) 
    if not then saveStatus(Success)
});  

我想为上面的函数添加一个超时,这样如果它有写入状态那么它应该超时否则如果 success/failure none 被写入数据库可以采取进一步的行动.

有什么方法可以知道函数 A 处理 saveStatus() 并同时取消超时?

是的,你可以使用这个:

function PromiseTimeout(promise, ms) {
  let timeout;
  return Promise.race([
      promise,
      new Promise((_, reject) => {
         timeout = setTimeout(() => reject(new Error('timeout')), ms)
      })
  ]).then(x => { clearTimeout(timeout); return x });
}

此代码段摘自开源代码 I've written time ago

所以,如果你有一个想要超时的承诺,你可以像这样使用它:

PromiseTimeout(A(), 1000) // 1 sec timeout
.then(() => everything ok and not timeout)
.catch((err) => maybe error maybe timeout)