Обещание Q при ошибке никогда не вызывалось

В документах 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 Я хотел бы отслеживать необработанные исключения (и, возможно, отклонения тоже) с хорошей трассировкой стека


person aleclofabbro    schedule 10.05.2014    source источник
comment
вы правы, отредактировал. я тоже хочу отслеживать необработанные отказы, но мой вопрос касается исключений.   -  person aleclofabbro    schedule 10.05.2014


Ответы (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, а затем удалена)

person Benjamin Gruenbaum    schedule 10.05.2014
comment
хорошо, я понимаю .. но как насчет трассировки стека? Q.error выходит из системы TypeError: Cannot read property '_prop' of undefined, но трассировки стека нет, несмотря на то, что Q.longStackSupport = true; - person aleclofabbro; 10.05.2014
comment
Интересно, кажется, что трассировка стека Q недостаточно умна, все остальное кажется в порядке в соответствии с документами и соответствующим кодом. В Bluebird вы получаете От предыдущего события: ... at get` - person Benjamin Gruenbaum; 10.05.2014
comment
подождите, я нашел это, и регистрация e.stack в Q.onerror работает. ... он не появился с util.inspect, потому что это геттер! - person aleclofabbro; 10.05.2014