为什么deferred.resolve的行为不像q手册中那样?

时间:2014-01-04 01:48:23

标签: javascript node.js q

这可能是一个愚蠢的问题,但我无法解决这个问题。

考虑以下代码:

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 errorq手册指出:

  

拒绝功能是拒绝解决的简写   的承诺。

q.fcall(throwError)应该产生被拒绝的承诺,所以延期应该被拒绝,对吗?

请注意,这是一个纯粹假设的问题,我知道这不会在现实世界中使用。

1 个答案:

答案 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被拒绝。你可以通过以下两种方式实现这一目标。

  1. 使用def.reject(err);拒绝它。
  2. 正如您的引言所述,请使用被拒绝的承诺def.resolve(rejected);解决此问题。