Cách xử lý lời hứa từ chối

Lời hứalà một trong những điều tốt nhất đã xảy ra với JavaScript trong vài năm qua.

Khi chúng tôi gọi một hàm trả về một lời hứa, chúng tôi chuỗithen()phương thức của lời hứa để chạy một hàm khi lời hứagiải quyết.

Đây là một ví dụ sử dụngAPI tìm nạp:

fetch('/data.json')
  .then(response => { 
    console.log(response.status)
  })

Điều gì xảy ra nếu có lỗi trong quá trìnhfetch()gọi? Có lẽ mạng không khả dụng. Hoặc yêu cầu mạng trả về lỗi.

Lời hứa sẽ từ chối. Một lời hứa sẽ giống như thế này:

const thePromise = new Promise((resolve, reject) => {

})

Bên trong lời hứa, chúng ta được truyền 2 tham số, 2 hàm. Bên trong phần thân, nếu tất cả đều được tìm thấy, hàm giải quyết () được gọi là:

const thePromise = new Promise((resolve, reject) => {
  resolve('ok') //you can pass any value
})

Nếu điều gì đó không tốt xảy ra, hàm từ chối () được gọi là:

const thePromise = new Promise((resolve, reject) => {
  reject('error message') //you can pass any value
})

Nếu có điều gì xấu xảy ra, chúng ta phải xử lý việc từ chối lời hứa. Chúng tôi làm như vậy bằng cách sử dụngcatch()phương pháp của lời hứa:

thePromise
  .catch(error => {
    console.error(error)
  })

Chúng ta luôn phải thêm mộtcatch(), nếu không thì những lời hứa sẽâm thầm thất bại.

Chúng ta có thể xâu chuỗicatch()đến mộtthen()phương pháp:

thePromise
  .then(response => { 
    console.log(response)
  })
  .catch(error => {
    console.error(error)
  })

Hoặc thậm chí nhiều lời hứa, nếu bạn có một chuỗi lời hứa:

const thePromise = new Promise((resolve, reject) => {
  resolve({
    doSomething: function() {
      return new Promise((resolve, reject) => {
        reject('error!') //you can pass any value
      })
    }
  })
})

thePromise .then(response => { return response.doSomething() }) .then(response => { console.log(response) }) .catch(error => { console.log(error) })

Trong trường hợp này, nếuthePromisebị từ chối, việc thực thi chuyển trực tiếp đếncatch()phương pháp.

Bạn có thể thêmcatch()phương pháp ở giữa haithen()nhưng bạn sẽ không thể phá vỡ chuỗi khi điều gì đó xấu xảy ra. Và giá trị trả về củacatch()(sẽ cóundefinedgiá trị nếu không được chỉ định) sẽ được chuyển đến phần sauthen().

Theo tôi, tốt nhất là rời đicatch()ở cuối chuỗi và sử dụng nó để xử lý tất cả các lỗi có thể xảy ra.

Xử lý lỗi theo quan điểm của tôi là tốt nhất trongasync / await, nhưng đôi khi chúng ta không thể tránh khỏi việc sử dụng lời hứa, vì vậy đó là cách bạn có thể thực hiện.

Tải xuống miễn phí của tôiSổ tay dành cho Người mới bắt đầu JavaScript


Các hướng dẫn js khác: