Promise

筆記一些不熟觀念而已

catch

若 promise 是 reject 那以下兩個相同

let promise = ((resolve, reject) => { setTimeout (reject, 0)});

promise.then(
  result => alert(result), 
  error => alert(error)
)
promise.then(result => alert(result))
.catch(error => alert(error))

但是以下兩個卻不同喔,若 f1 出現錯誤那 catch 會幫忙捕捉,但 f2 卻不會捕捉 f1 的 error,f2 只會捕捉 promise 得 reject

promise
  .then(f1)
  .catch(f2);
  
promise
  .then(f1, f2);

若兩種 Error 都寫那寫在參數裡的會優先執行

const promise = () => new Promise((resolve, reject) => {
  setTimeout(reject('oh no'), 0);
})

promise()
.then(result => xx, err => {
  console.log('err1', err)
})
.catch(error => {console.log('err2', error)}); // err1 oh no

finally

finally has no arguments. 不管成功或失敗都會執行,很適合拿來 cleanup

new Promise((resolve, reject) => {
  /* do something that takes time, and then call resolve/reject */
})
// runs when the promise is settled, doesn't matter successfully or not
.finally(() => alert("Promise ready"))
// so the loading indicator is always stopped before we process the result/error
.then(result => show result, err => show error)

Error handling with promises

若 catch 不放在最後,那 catch 後面的 then 還是可以繼續執行

Promise().then(result => result + 1)
.then(result => {
   throw Error('r')
   return 1
})
.catch(error => {console.log('error', error)})
.then(result => {console.log('result: ', result)})// result: 1
  • .catch handles errors in promises of all kinds: be it a reject() call, or an error thrown in a handler.

  • We should place .catch exactly in places where we want to handle errors and know how to handle them. The handler should analyze errors (custom error classes help) and rethrow unknown ones (maybe they are programming mistakes).

  • It’s ok not to use .catch at all, if there’s no way to recover from an error.

  • In any case we should have the unhandledrejection event handler (for browsers, and analogs for other environments) to track unhandled errors and inform the user (and probably our server) about them, so that our app never “just dies”.

Last updated