这可能是一个愚蠢的问题,但我无法解决这个问题。
考虑以下代码:
function throwError() {
throw Error("can't touch this.");
}
var def = q.defer();
def.promise.then(
function() {
console.log("no error");
},
function() {
console.log("error");
}
);
q.fcall(throwError).then(def.resolve, def.resolve).done();
在我看来,这应该打印error
。而是打印no error
。
q
手册指出:
拒绝功能是拒绝解决的简写 的承诺。
q.fcall(throwError)
应该产生被拒绝的承诺,所以延期应该被拒绝,对吗?
请注意,这是一个纯粹假设的问题,我知道这不会在现实世界中使用。
答案 0 :(得分:1)
这里的问题似乎与使用的语言有关,因此我将尝试将其细分一点以使其更清晰。当你打电话
var rejected = q.fcall(throwError);
然后rejected
确实是被拒绝的承诺。你当时在做什么
var def = q.defer();
def.promise.then(
function(arg1) {
console.log("no error");
},
function(arg2) {
console.log("error");
}
);
rejected.then(
function(){
def.resolve();
},
function(err){
def.resolve(err); // err === new Error();
}
);
当承诺被拒绝时,它将运行拒绝回调,触发def.resolve(err);
。 Q不知道def
是任何其他随机争吵的东西,所以你也可以打电话给def.resolve('random');
。你正在用一些论证解决def
。在这种情况下,它恰好是Error
的实例。这意味着您的no error
回调将被调用,arg1 === new Error()
。
现在,鉴于你提到的文件引用
拒绝功能是用拒绝承诺解决的简写。
你在做什么本质上是将被拒绝的承诺rejected
转换为承诺def.promise
,它将永远满足,但履行处理程序将收到错误作为第一个参数。
为了实现您的期望,您需要正确地使def.promise
被拒绝。你可以通过以下两种方式实现这一目标。
def.reject(err);
拒绝它。def.resolve(rejected);
解决此问题。