如果函数运行时间超过n秒,如何抛出并捕获错误

时间:2017-11-04 19:08:36

标签: javascript timeout

我有以下形式的功能:

async someFunction () {
  try {
    someStuff()
  } catch (err) {
    doSomeCleanup()
  }
}

来自队列的工作人员多次调用它。现在我有了一个新的要求,即如果一个工作人员在给定的工作人员运行此函数的时间超过30秒,那么工作人员应该会失败。我的直觉就是煽起像:

const timeoutCheck;
const time = new Date();
async someFunction () {
  try {
    timeoutCheck = setInterval(() => {
      if (new Date() - time > 30000) throw new Error("timeout");
    }, 2000);
    someStuff()
  } catch (err) {
    doSomeCleanup()
  } finally {
    clearInterval(timeoutCheck);
  }
}

但是我很快就知道setInterval在try / catch块之外运行,所以错误没有被捕获到catch块中但在主应用程序中并且整个应用程序崩溃而不仅仅是工作者失败。如果函数运行超过30秒,是否有一种很好的方法可以在try / catch块中包含此错误或以其他方式完成对try / catch块的错误?

1 个答案:

答案 0 :(得分:2)

您可以使用Promise.race()

let stop = () => new Promise((_, reject) =>
                   setTimeout(reject, 2999, "rejected"));

let fn = () => new Promise((resolve, _) =>
                 setTimeout(resolve, 3000, "resolved"));
                 
let someStuff = data => console.log(data);

let doSomeCleanup = err => console.error(err);

Promise.race([fn(), stop()])
.then(doSomeStuff, doSomeCleanup);