如果我不得不简化的话,Javascript的承诺是“通过.then()
方法安排对事态 采取行动的方式”。
在我的终端中执行以下操作之后:
BASE$> node
> var promise = Promise.reject("reason 42");
因此我很惊讶地看到了这个结果:
> (node:8783) UnhandledPromiseRejectionWarning: reason 42
(node:8783) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:8783) [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.
因为我正要写。
> promise.catch(console.log);
引起这个问题的原因是:
我是否可以合理地确定node.js
仅发出此警告(并且威胁“将来我会完全保释”,因为在node.js控制台/ REPL中逐步运行了代码?< / p>
node.js
如何得出一个结论,那就是应否处理承诺拒绝?
因此,我对以下内容进行了测试,使其工作有所不同
var promise = Promise.reject("reason 42"); promise.catch(console.log);
tmp.js
)中的“相同代码”进行评估
var promise = Promise.reject("reason 42") promise.catch(console.log);`)通过
node tmp.js
都产生预期的输出“ reason 42
”,但不显示任何警告,如前所述。
因此,如何解决?我的假设是否可以确定,因此在节点控制台REPL
中未处理的诺言的确定是否反映了每次REPL
循环迭代中的到达终点?
答案 0 :(得分:3)
为了使承诺拒绝得到处理,应将其与catch
或then
链接在一起,并在同一刻度上带有2个参数。
这将导致UnhandledPromiseRejectionWarning
:
var promise = Promise.reject("reason 42");
setTimeout(() => {
promise.catch(console.error);
});
这不会引起UnhandledPromiseRejectionWarning
:
var promise = Promise.reject("reason 42");
promise.catch(console.error);
Node.js REPL中异步评估的行会导致它们之间的延迟。为了按照编写顺序同步评估行,可以使用https://socket.io。或者可以编写代码以明确地将其评估为一个块:
;{
var promise = Promise.reject("reason 42");
promise.catch(console.error);
}
或者IIFE:
(() => {
var promise = Promise.reject("reason 42");
promise.catch(console.error);
})()
答案 1 :(得分:2)
我想扩展@estus答案,尤其是第一句话:
为了使承诺拒绝得到处理,应将其与catch或随后在同一刻度上带有2个参数链接在一起。
我不会完全同意。我认为,调用then
或catch
的每个诺言都很好,但是,当调用这些方法时,您将创建新的Promises,而它们只是继承了问题。 / p>
我们经常谈论承诺链,但实际上它是一棵树,因为您可以从同一个“父”分支多个“子承诺”,而错误会影响所有这些。
const root = Promise.reject("reason 42");
const a = root.then(value => value*2)
.then(...);
const b = root.then(value => value*3)
.then(...);
因此,您建立了承诺链/树;发生错误。错误会传播到该树中的子承诺,... ...如果该(或任何其他)错误达到任何叶承诺(而不会被捕获) ),您会得到一个UnhandledPromiseRejectionWarning
。
您可以对诺言做一百万种事情,如何对它们进行连锁/分支以及如何/在哪里捕捉错误,...所以我可以给您最好的总结:
由于Promises
都是时间,所以您有时间直到错误到达链catch
的末端。
我可以合理地确定node.js仅发出此警告(并且威胁“将来我会完全保释”,因为代码是在node.js控制台中逐步运行的。
是