Handle error from setTimeout

后端 未结 4 648
孤城傲影
孤城傲影 2020-12-02 15:41

Simple question about try-catch for function in setTimeout

try {
    setTimeout(function () {
        throw new Error(\'error!\');
    }, 300)
} catch (e) {
         


        
4条回答
  •  抹茶落季
    2020-12-02 16:28

    Functions scheduled to run with setTimeout are executed in the main loop, outside the body of code that originated them.

    To handle errors, put the try-catch inside the setTimeout handler:

    setTimeout(function () {
      try {
        throw new Error('error!');
      } catch (e) {
        console.error(e);
      }
    }, 300)
    

    If you need to access the Error object from block that called setTimeout, use Promises:

    const promise = new Promise((resolve, reject) => {
      setTimeout(function () {
        try {
          throw new Error('error!');
        } catch (e) {
          reject(e)
        }
      }, 300)
    })
    
    promise
      .then(result => console.log("Ok " + result))
      .catch(error => console.error("Ouch " + error))
    

    This example above is not the most elegant way of handling the case with a Promise. Instead, implement a delay(ms) function like this:

    function delay(ms) {
      return new Promise(resolve => setTimeout(resolve, ms))
    }
    

    Then call

    delay(300).then(myFunction).catch(handleError)
    

提交回复
热议问题