Jak działa fetch catch w JS?

0

Może ktoś wytłumaczyć jak dokładnie działa catch. Powiedzmy, że mamy taki kod:

const url = "example API endpoint"
fetch(url)
      .then((res) => {  // --> console.log po throw nie zostanie wywołany
          throw "Error occured";
          console.log(res);
          res.json()
      })
      .then((user) => {
         console.log("json object"))  // --> callback nie zostaje wywołany
      }
      .catch((err) => console.log(err))

Skoro druga metoda .then(user=>{}) nie zostaje wywołana ponieważ w poprzedniej metodzie łańcucha wyrzuciło wyjątek throw, to jak wiadomość z throw pomija kolejne .then i wywołuje .catch na końcu łańcucha wywołań? W końcu .catch jest zwracane z drugiego .then który nie został nawet wywołany.

4

Drugie then jest jak najbardziej wywoływane. To lambda przekazywana jako argument nie jest wywoływana

2

Tak jak @KamilAdam napisał - może przykładowa implementacja Ci to rozjaśni:

class Example {
  constructor(val) {
    this.handlers = []
    this.errorHandler = (e) => {
      throw e
    }

    // Set timeout to simulate async request:
    setTimeout(() => {
      try {
        for (const handler of this.handlers) {
          val = handler(val)
        }
      } catch (e) {
        this.errorHandler(e)
      }
    }, 0)
  }

  then(fn) {
    this.handlers.push(fn)
    return this
  }

  catch(fn) {
    this.errorHandler = fn
  }
}


// Usage:

const a = new Example(1)
  .then((val) => {
    console.log(val)
    return val * 2
  })
  .then((val) => {
    throw new Error("Oops!")
  })
  .then((val) => {
    console.log(val)
  })
  .catch((err) => {
    console.log(err.message)
  })

CodePen: https://codepen.io/caderek/pen/oNwjOgp?editors=0012

1 użytkowników online, w tym zalogowanych: 0, gości: 1