【问题标题】:Why does logging a rejected `Promise` in Node 7.2.0 result in also logging a stack trace?为什么在 Node 7.2.0 中记录被拒绝的“Promise”会导致同时记录堆栈跟踪?
【发布时间】:2016-12-04 21:16:38
【问题描述】:

在 Node 7.2.0 中运行此代码时:

let prms = Promise.reject(new Error('error'));
prms.catch(() => {});

console.log(prms);

我期待 Promise {<rejected> Error: error} 被记录到控制台,但我收到了以下输出:

Promise {
  <rejected> Error: error
    at Object.<anonymous> (/Users/davidlund/Dropbox/test.js:1:89)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:535:3 }

为什么会这样?

【问题讨论】:

    标签: javascript node.js error-handling es6-promise


    【解决方案1】:

    您看到的是错误的.valueOf 表示:

    > (new Error('error')).valueOf();
    Error: error
        at repl:1:2
        at realRunInThisContextScript (vm.js:22:35)
        at sigintHandlersWrap (vm.js:98:12)
        at ContextifyScript.Script.runInThisContext (vm.js:24:12)
        at REPLServer.defaultEval (repl.js:313:29)
        at bound (domain.js:280:14)
        at REPLServer.runBound [as eval] (domain.js:293:12)
        at REPLServer.onLine (repl.js:513:10)
        at emitOne (events.js:101:20)
        at REPLServer.emit (events.js:188:7)
    

    比较:

    function Foo() {
    
    }
    
    Foo.prototype.valueOf = function () {
        return "FOOBAR"
    }
    
    let prms = Promise.reject(new Foo);
    prms.catch(() => {});
    
    console.log(prms); // Promise { <rejected> [String: 'FOOBAR'] }
    

    【讨论】:

    • 但是为什么.valueOf 部分被记录到控制台。这是 Node 7.2.0 中的新功能吗? - 在我更新节点之前输出不同
    • @rabbitco console.log 没有标准化,因此它可以输出开发人员想要的任何内容。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多