Saya menggunakan pencegat respons axios dan setelah saya membatalkan permintaan, saya harus memutuskan rantai janji. Saya tidak ingin menambahkan pemeriksaan kesalahan permintaan yang dibatalkan untuk semua permintaan di aplikasi saya. Saya sudah mencoba bluebird, tetapi sepertinya itu hanya pembatalan janji, bukan pemutusan rantai. Saya harus memproses kesalahan pada tangkapan pertama. Diagram ini menunjukkan masalah secara umum. Yang terbaru kemudian dan tangkapan ada di file yang berbeda.

Promise
.then((response) => {

)
.catch((error) => {
  // break promise here
})
.then((response) => {
 // skip
 // I don't want any extra checks here!
)
.catch((error) => {
  // skip
  // I don't want any extra checks here!
})
1
Nikronis 28 Oktober 2019, 19:18

2 jawaban

Jawaban Terbaik

Pilihan lain adalah melempar kesalahan khusus yang dapat ditangkap dalam blok catch tunggal di bagian paling akhir seperti:

const errorHandler = require('path/to/handler')
class ProcessingError1 extends Error {
    constructor(message) {
        super(message);
        this.name = "ProcessingError1";
    }
}
class ProcessingError2 extends Error {
    constructor(message) {
        this.message = message;
        this.name = "ProcessingError2";
    }
}
const process1 = async () => {
    throw new ProcessingError1("Somethign went wrong");
};
const process2 = async () => {
    return { some: "process" };
};
const someApiCall = async () => ({ some: "response" });

someApiCall()
    .then(process1)
    .then(process2) // process2 is not run if process1 throws an error
    .catch(errorHandler);
// ErrorHandler.js

module.exports = e => {
        if (e instanceof ProcessingError1) {
            // handle error thrown from process1
        }
        else if (e instanceof ProcessingError2) {
            // handle error thrown from process2
        }
        else {
            // handle other errors as needed..
        }
    }
1
dillon 30 Oktober 2019, 12:30

Simpan hanya satu blok tangkapan di akhir untuk mengumpulkan semua kesalahan yang dipicu oleh rantai janji Anda.

Jika satu janji melempar yang berikut dalam rantai tidak dieksekusi

Promise
.then((response) => {

)
.then((response) => {
 // skip
 // I don't want any extra checks here!
)
.catch((error) => {
  // skip
  // I don't want any extra checks here!
})
0
Karim 28 Oktober 2019, 16:20