以下代码正常运行,没有异常,如果函数栏中有异常,程序刚刚完成,没有任何输出。我检查了Q的源代码,它捕获异常并拒绝它。花了一些时间,但仍然不知道什么是获取异常信息的正确方法。
function foo(val) {
var deferred = Q.defer();
if (val) {
deferred.resolve(val);
} else {
deferred.reject(val);
}
return deferred.promise;
}
function bar() {
var deferred = Q.defer();
foo(true)
.then(function(res) {
throw new Error('true error!');
deferred.resolve(true);
}, function(err) {
throw new Error('false error!');
deferred.reject(false);
});
return deferred.promise;
}
bar()
.then(function(res) {
console.log('true');
}, function(err) {
console.log('false');
})
.done();
答案 0 :(得分:0)
首先,你从bar()返回的deferred的延迟永远不会被解决或拒绝(你只需要在第一行创建它,不做任何事情,并在最后一行返回它的承诺)
我们假设你用这种方式修复它:http://jsfiddle.net/KW9d9/
function bar() {
var promise = foo(true);
现在(在你的代码的最后)你仍然在寻找错误而不是它们被解雇的承诺。当我们的第一个承诺调用.than时,会返回一个新的承诺。想想'那么'正在创造一个包含前一个的新承诺。 像这样修复它会给我们在'then'承诺中引发的异常,因为在then处理程序中抛出的异常被用作拒绝值。 请看:http://jsfiddle.net/ybefw/
function bar() {
return foo(true).then(function(res) {....