代码之家  ›  专栏  ›  技术社区  ›  humanityANDpeace

是什么决定了node.js(console/script)中的承诺拒绝未被处理?

  •  1
  • humanityANDpeace  · 技术社区  · 6 年前

    后来 ,通过 .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 REPL ?

    你怎么知道的 已经得出结论,拒绝承诺是不可处理的?

    1. 在一个REPL迭代中组合的“相同代码”的评估:
      var promise = Promise.reject("reason 42"); promise.catch(console.log);
    2. 从文件中评估“相同代码”(例如。 tmp.js
      var promise = Promise.reject("reason 42") 
      promise.catch(console.log);`)
      
      通过 node tmp.js

    reason 42 “如前所示,未提出任何警告。

    那么这是怎么回事呢?我的假设能否被证实,在节点控制台中确定一个未处理的承诺 REPL ,反射是每个 复制 循环迭代?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Estus Flask    6 年前

    catch then

    这将导致 UnhandledPromiseRejectionWarning

    var promise = Promise.reject("reason 42");
    
    setTimeout(() => {
      promise.catch(console.error);
    });
    

    未处理PromisejectionWarning :

    var promise = Promise.reject("reason 42");
    promise.catch(console.error);
    

    Node.js REPL中异步计算的行会导致它们之间的延迟。为了按照行的写入顺序同步计算行, editor mode 可以使用。或者,可以将代码编写为明确地作为块进行计算:

    ;{
    var promise = Promise.reject("reason 42");
    promise.catch(console.error);
    }
    

    或生命:

    (() => {
    var promise = Promise.reject("reason 42");
    promise.catch(console.error);
    })()
    
        2
  •  2
  •   Thomas    6 年前

    我想扩展一下@estus的答案,特别是第一句话:

    为了让承诺拒绝被认为是被处理的,它应该被catch链接起来,或者在同一个记号上用两个参数链接起来。

    我不完全同意。我认为每一个承诺 then catch 被称为是好的, 但是 当调用这些方法时,您创建了新的承诺,而它们只是继承了问题。

    我们经常谈论承诺链,但实际上它是一棵树,因为您可以从同一个“父承诺”分支多个“子承诺”,错误会影响所有承诺。

    const root = Promise.reject("reason 42");
    
    const a = root.then(value => value*2)
                  .then(...);
    
    const b = root.then(value => value*3)
                  .then(...);
    

    (或任何其他) 任何 叶子的承诺 (沿线某处未被抓获) 你会得到一个 UnhandledPromiseRejectionWarning

    你可以用承诺做很多事情,你如何把它们链接起来,如何发现错误。。。所以我能给你的最好的总结是:

    Promises 都是关于时间的,你有时间,直到错误到达链的末端 抓住

    我是否可以合理地确定node.js只提取其中一个警告(以及威胁“将来我将完全退出”,因为代码是在node.js控制台中逐步运行的