Hal-hal penting untuk dipahami di sini
Baik thendan catchfungsi mengembalikan objek janji baru.
Entah melempar atau menolak secara eksplisit, akan memindahkan janji saat ini ke negara yang ditolak.
Karena thendan catchmengembalikan objek janji baru, mereka dapat dirantai.
Jika Anda melempar atau menolak di dalam handler janji ( thenatau catch), itu akan ditangani di handler penolakan berikutnya di jalur rantai.
Seperti yang disebutkan oleh jfriend00, thendan catchpenangan 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 do1dengan melempar Errorobjek. Sekarang, janji saat ini akan dalam keadaan ditolak dan kontrol akan ditransfer ke penangan berikutnya, yang thendalam kasus kami.
Karena thenhandler tidak memiliki handler penolakan, maka handler do2tidak akan dieksekusi sama sekali. Anda dapat mengkonfirmasi ini dengan menggunakan console.logdi 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 catchpenangan penolakan, ketika Anda melakukannya console.log(err.stack);di dalamnya, Anda dapat melihat jejak tumpukan kesalahan. Sekarang, Anda melempar Errorobjek dari itu sehingga janji yang dikembalikan oleh catchjuga 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 catchhandler 1, Anda mendapatkan nilai promiseobjek sebagai ditolak.
Cara yang sama, janji yang dikembalikan oleh catchpawang 1, juga ditolak dengan kesalahan yang sama dengan yang promiseditolak dan kami mengamatinya di catchpawang kedua .
.catch(…)kembali.