异步node.js代码(使用Q)不写入标准错误

时间:2014-11-14 11:20:04

标签: javascript node.js asynchronous error-handling q

我在编写异步node.js代码时遇到了以下问题:异步块中抛出的错误不会打印到控制台标准错误,它们只是无声地失败。

这是一个重新创建问题的独立工作示例,我在异步回调之外和之内调用了一个不存在的函数:

注意//表示的行!评论

var Q = require('Q');

function asyncFunc(){
    var deferred = Q.defer();

    setTimeout(function(){
        console.log('resolving promise!');
        deferred.resolve('resolveMessage');
    },2000);

    return deferred.promise;
}

asyncFunc()
    .then(function (msg) {
        nonExisting(); // ! calling here puts no error on the console
        console.log('Promise.then entered, msg:',msg);
    });

//nonExisting(); // ! calling here results in referenceError correctly printed to the console

我使用node file.js命令运行标准Windows命令提示符下的代码。 (我在Windows 7上运行节点0.10.32)

为什么会发生这种情况,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是预期的行为。

来自Q API Reference:

  

因为抛出的异常被消耗并转换   对于拒绝,链条末端的例外很容易   不小心,默默地忽略。

如果您希望在链中的任何承诺被拒绝或在解析处理程序中抛出异常时传播异常,请使用done

asyncFunc().done(function (msg) { nonExisting(); }); //will throw an error in the next tick
process.on('uncaughtException', console.log);

您也可以将其链接到另一个then,其拒绝处理程序将被执行。

asyncFunc()
    .then(function (msg) {
        nonExisting(); // ! calling here puts no error on the console
        console.log('Promise.then entered, msg:',msg);
    })
    .then(function noop () {}, console.log.bind(console, 'An error was thrown'));