我不明白...是我还是这是节点中的错误?
这可以按预期进行:
const a = new Promise((resolve, reject) => {
setTimeout(() => reject('timeout'), 1000);
});
a.catch(console.log);
这会引发警告:
const a = new Promise((resolve, reject) => {
setTimeout(() => reject('timeout'), 1000);
});
a.then(console.log);
a.catch(console.log);
我明白了
timeout
(node:40463) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): timeout
(node:40463) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
答案 0 :(得分:3)
带注释并稍作修改的源代码:
// promise A is created
const a = new Promise((resolve, reject) => {
setTimeout(() => reject('timeout'), 1000);
});
// promise A is chained with .then()
// means new promise is created
// and only resolve catched here
const aThenPromise = a.then(console.log);
// promise A is chained with .catch()
// means new promise is created
// and only reject catched here
const aCatchPromise = a.catch(console.log);
// aThenPromise !== aCatchPromise
当承诺a
被拒绝时:
aCatchPromise
可以正常工作,并且timeout
已登录到控制台aThenPromise
不执行任何操作,因为它仅与resolve()
一起使用,并且拒绝是通过它传递的,并且没有得到处理,因为它与Promise不同。这导致UnhandledRejection
您需要将渔获量添加到aThenPromise
,
一个可能的选择是a.then(console.log).catch(console.log)
,它将处理通过.then
传递的拒绝
答案 1 :(得分:2)
在.then(...)
中使用诺言会返回新的诺言(称为chaining)。因此,当您执行以下操作时:
a.then(console.log); // line 1 creates a new promise "b"
a.catch(console.log); // line 2 handles rejection on promise "a"
其中a
是您的最初承诺,您在第1行上创建了一个新的承诺(现在不再是a
了。
b
)。因此,即使您将.catch(...)
与a
配合使用,也无法处理b
上的拒绝,这解释了您在控制台上看到的消息。
为避免出现此消息,您应该在第1行的新承诺.catch(...)
中添加b
答案 2 :(得分:-2)
保证工作是一连串的动作,如果您轻视该动作,它将不会起作用。
a.then(console.log).catch(console.log);