尽管兑现了承诺但仍未兑现承诺

时间:2018-09-19 15:25:13

标签: javascript node.js promise

我不明白...是我还是这是节点中的错误?

这可以按预期进行:

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.

3 个答案:

答案 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);