then(onFulfilled, undefined) - then(undefined, onRejected) - Mengapa catch() memenuhi janji yang dikembalikan?
P粉446800329
P粉446800329 2024-03-30 23:21:22
0
2
589

Saya sedang mencuba kod ini:

let with999 = Promise.resolve(999);

let returnCatch = with999
.catch(reason => {
  console.log("catch: " + reason);
});

returnCatch.then(data => {
  console.log("then: " + data);
});

Apabila saya tiba-tiba menyedari:

Janjiwith999履行 因此 catch() 方法未执行< /strong>,但是,catch() 返回的 Promise(在本例中为 returnCatch)最终fulfilled,其值与 相同>with999.

Jadi, soalan saya, kenapa catch() 最终实现了 returnCatch berjanji?

Saya menjangkakan returnCatch挂起(因为 catch() tidak dilaksanakan) dan menggunakan then()< /code> tiada apa yang berlaku.

Hal yang sama berlaku dengan "melakukan sebaliknya", then()then() Menolak janji:

let rejected = Promise.reject(new Error('Ups!'));

let returnThen = rejected
.then(reason => {
  console.log("then: " + reason);
});

returnThen.
catch(data => {
  console.log("catch: " + data);
});

Bolehkah seseorang menerangkan kepada saya apa yang berlaku?

P粉446800329
P粉446800329

membalas semua(2)
P粉111627787

Kodnya sama seperti merantai .kemudian dan .mengambil Janji awal. Ini tidak berlaku, mencipta pembolehubah baharu untuk tangkapan memerlukan menolaknya dan kemudian menyalurkannya ke seterusnya.

Anggap sebagai menulis pernyataan yang sama sekali gus tanpa menggunakan berbilang pembolehubah, tingkah laku itu lebih masuk akal. Memandangkan Promise diselesaikan, .then pertama akan dilaksanakan, dan jika Promise ditolak, .catch pertama akan dilaksanakan, tanpa mengira susunan atau pengisytiharan mereka atau berapa banyak pembolehubah yang anda gunakan untuk melakukan ini.

Sunting: Coretan kod ini adalah sama seperti yang di atas, melepasi Janji yang sama.

let with999 = Promise.resolve(999).catch(reason => {
  console.log("catch: " + reason);
}).then(data => {
  console.log("then: " + data);
});
P粉464082061

Soalan "mengapa" sentiasa sukar untuk dijawab, tetapi pada asasnya ia bermuara kepada ini: kerana ia berkesan.

Mungkin panggilan balik daripada catch() 传递履行结果的行为来看,这一点并不是很明显,但请看一下 .then() 传递的第二个示例关于拒绝:我们希望执行.catch()回调,以处理承诺链中早期出现的任何错误。我们不希望 Promise 链在中间停止(Promise 保持挂起状态),因为出现错误并且 .then() tidak dilaksanakan.

Anda telah menyedari bahawa tingkah laku ini adalah dalam kaedah .then(handleResult).catch(handleError) 之间是对称的。但请注意,这些实际上只是 .then(handleResult, null).then(null, handleError) 的简化语法。 then yang sebenarnya mempunyai dua parameter, satu untuk mengendalikan pemenuhan dan satu untuk mengendalikan penolakan. Anda boleh (dan biasanya harus) lulus kedua-dua peperiksaan pada masa yang sama.

.then() 返回的 Promise 会根据相应处理程序的结果进行解析(如果调用抛出异常则被拒绝),Promise 链背后的想法是它总是在最初的承诺得到解决后才得到解决。如果未提供相应的回调,则默认情况下仅传递结果 - 无论是 .then(null, null).then(null, handleError) 均已满足Promise 或被拒绝的 Promise 上的 .then(handleResult, null).

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan