then(onFulfilled, undefiniert) - then(undefiniert, onRejected) - Warum erfüllt Catch() das zurückgegebene Versprechen?
P粉446800329
P粉446800329 2024-03-30 23:21:22
0
2
536

Ich versuche diesen Code:

let with999 = Promise.resolve(999);

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

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

Als mir plötzlich klar wurde:

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

Meine Frage ist also, warum catch() 最终实现了 returnCatch versprochen?

Ich habe erwartet returnCatch挂起(因为 catch() nicht ausgeführt) und mit then()< /code> passiert nichts.

Das Gleiche passiert mit „das Gegenteil tun“, then()then() Ein Versprechen ablehnen:

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

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

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

Kann mir jemand erklären, was los ist?

P粉446800329
P粉446800329

Antworte allen(2)
P粉111627787

代码与将 .then 和 .catch 链接到初始 Promise 相同。情况并非如此,为 catch 创建一个新变量需要将其拒绝,然后通过管道传递到下一个 then。

将其视为一次编写相同的语句而不使用多个变量,这样的行为会更有意义。由于 Promise 已解析,因此第一个 .then 将被执行,如果 Promise 被拒绝,则第一个 .catch 将被执行,无论顺序或声明它们或您使用多少个变量来执行此操作。

编辑: 此代码片段与上面的代码片段相同,传递的是相同的 Promise。

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

“为什么”的问题总是很难回答,但基本上可以归结为:因为它有用。

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

您已经意识到此行为在 .then(handleResult).catch(handleError) 之间是对称的。但请注意,这些实际上只是 .then(handleResult, null).then(null, handleError) 的简化语法。 then 方法 实际上有两个参数,一个用于处理履行,一个用于处理拒绝。您可以(而且通常应该)同时通过这两项考试。

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage