为什么catch()会实现返回的promise?

问题描述 投票:0回答:3

我正在尝试这段代码:

let with999 = Promise.resolve(999);

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

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

当我突然意识到:

承诺

with999
fulfilled ,因此
catch()
方法不会执行,但是,
catch()
(在本例中为
returnCatch
)返回的承诺最终会 fulfilled,其值与
with999
相同。

所以,我的问题是,为什么

catch()
最终会实现
returnCatch
的承诺?

我预计

returnCatch
pending (因为
catch()
没有被执行)并且用
then()
消耗它不会发生任何事情。

“做相反的事情”也会发生同样的情况,

then()
拒绝承诺:

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

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

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

有人可以向我解释一下发生了什么事吗?

javascript asynchronous promise
3个回答
1
投票

为什么

catch()
履行返回的承诺?

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

也许从

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

那么这是怎么回事?

您已经意识到这种行为在

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

.then()

返回的promise将根据相应处理程序的结果进行解析(如果调用抛出异常,则被拒绝),并且promise链背后的想法是它
always在原始promise解决后得到解决。如果未提供相应的回调,则默认情况下只会传递结果 - 无论是 .then(null, null)
、已履行的 Promise 上的 
.then(null, handleError)
,还是已拒绝的 Promise 上的 
.then(handleResult, null)


0
投票
代码与将 .then 和 .catch 链接到初始 Promise 相同。为 catch 创建一个新变量并不要求它被拒绝,然后通过管道传递到下一个 then。

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


-2
投票
我认为你错过了理解承诺的行为。

Promise 是异步函数在调用它时立即给出的变量。当函数最终执行时,它将解决或拒绝承诺。

如果它解决了promise,则传递到“then”的回调将使用由函数结果填充的参数来执行。

如果它拒绝 Promise,则传递到“catch”的回调将使用由错误填充的参数来执行。

具体来说,您没有异步函数。你直接解决或拒绝承诺。这意味着,在第一种情况下,您指定希望执行“then”回调并忽略“catch”。在第二种情况下,你正在做相反的事情。

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.