Hal-hal penting untuk dipahami di sini
Baik then
dan catch
fungsi mengembalikan objek janji baru.
Entah melempar atau menolak secara eksplisit, akan memindahkan janji saat ini ke negara yang ditolak.
Karena then
dan catch
mengembalikan objek janji baru, mereka dapat dirantai.
Jika Anda melempar atau menolak di dalam handler janji ( then
atau catch
), itu akan ditangani di handler penolakan berikutnya di jalur rantai.
Seperti yang disebutkan oleh jfriend00, then
dan catch
penangan tidak dieksekusi secara bersamaan. Ketika pawang melempar, itu akan segera berakhir. Jadi, tumpukan akan dibatalkan dan pengecualian akan hilang. Itu sebabnya melempar pengecualian menolak janji saat ini.
Dalam kasus Anda, Anda menolak di dalam do1
dengan melempar Error
objek. Sekarang, janji saat ini akan dalam keadaan ditolak dan kontrol akan ditransfer ke penangan berikutnya, yang then
dalam kasus kami.
Karena then
handler tidak memiliki handler penolakan, maka handler do2
tidak akan dieksekusi sama sekali. Anda dapat mengkonfirmasi ini dengan menggunakan console.log
di dalamnya. Karena janji saat ini tidak memiliki penangan penolakan, itu juga akan ditolak dengan nilai penolakan dari janji sebelumnya dan kontrol akan ditransfer ke penangan berikutnya yang catch
.
Seperti catch
penangan penolakan, ketika Anda melakukannya console.log(err.stack);
di dalamnya, Anda dapat melihat jejak tumpukan kesalahan. Sekarang, Anda melempar Error
objek dari itu sehingga janji yang dikembalikan oleh catch
juga akan dalam keadaan ditolak.
Karena Anda belum memasang penangan penolakan apa pun pada catch
, Anda tidak dapat mengamati penolakan tersebut.
Anda dapat membagi rantai dan memahami ini dengan lebih baik, seperti ini
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
Output yang akan Anda dapatkan akan seperti
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
Di dalam catch
handler 1, Anda mendapatkan nilai promise
objek sebagai ditolak.
Cara yang sama, janji yang dikembalikan oleh catch
pawang 1, juga ditolak dengan kesalahan yang sama dengan yang promise
ditolak dan kami mengamatinya di catch
pawang kedua .
.catch(…)
kembali.