---
description: 筆記一些不熟觀念而已
---

# 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”.
