【问题标题】:Q promise onerror never invokedQ promise onerror 从未调用过
【发布时间】:2014-05-11 03:25:45
【问题描述】:

Kris Kowal 的 Q 文档指出 Q.onerror 在未处理的异常上被调用。
我不能让它工作:

var Q = require('q');
Q.longStackSupport = true;
var util = require('util');

Q.onerror=function(){
    console.log('Q.onerror::')
    console.log(util.inspect(arguments))
}

function get(){
    var def=Q.defer();
    def.resolve('resolved');    
    return def.promise;
}

get()
.then(function(val){
    console.log('ok:'+val)
    undefined._prop;  // i would expect this exception to be  
                      // forwarded to Q.onerror... but it doesn't
    console.log('not reachd')
});

输出:

ok:resolved

我想我不太了解Q.onerror 的用法 我想用一个很好的堆栈跟踪来跟踪未处理的异常(也可能是拒绝)

【问题讨论】:

  • 你说得对,已编辑。我也希望跟踪未处理的拒绝,但我的 Q 是关于异常的。

标签: javascript node.js promise q


【解决方案1】:

Q 目前不跟踪*未处理的拒绝,因此您必须明确告诉它链已结束。

Q.onerror 处理 done 子句中未处理的异常:

get()
.done(function(val){ // you can not chain this, this indicates the chain is done
    console.log('ok:'+val)
    undefined._prop;  // i would expect this exception to be  
                      // forwarded to Q.onerror... but it doesn't
    console.log('not reachd')
});

这与 Bluebird 等库不同,后者可以自行找出未处理的拒绝,或者 Firefox 中使用 GC 检测未处理的拒绝的原生承诺。

*(atm,一个实验性的特性被添加到Q中然后被移除)

【讨论】:

  • 好的,我明白了.. 但是堆栈跟踪呢? Q.error 注销TypeError: Cannot read property '_prop' of undefined,但没有堆栈跟踪,尽管 Q.longStackSupport = true;
  • 有趣,似乎 Q 的堆栈跟踪不够智能,根据文档和相关代码,其他一切似乎都井井有条。在 Bluebird 中,您会得到“来自上一个事件:...在 get`
  • 等等,我发现this 并在Q.onerror 中记录e.stack 有效.. 它没有出现在util.inspect 中,因为它是一个吸气剂!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多