为什么这解决了Q promise用promise来响应valueOf()?

时间:2013-07-18 21:32:01

标签: javascript promise q

我有一个对象,其值来自AJAX请求。我正在将它转换为承诺,并且遇到了一些我不期望的承诺行为。我在这里有一个展示相同行为的例子,但我用Q.all()代替我的AJAX请求。

(Thing = function(){
  var promise;
  var refresh = function() {
    promise = Q.all(["a", "b"]);
  };

  var fetch = function(i) {
    return promise.then(function(promiseVal){
      return promiseVal[i];
    });
  };

  refresh();

  return {
    "fetch": fetch,
    "refresh": refresh,
    "promise": promise
  };

}());

在加载时执行Thing并运行“刷新”以最初填充自身。 “fetch”函数的要点是我的异步请求(在这种情况下为Q.all)返回一个数组的promise,但我真正想要的是对数组中元素的承诺(例如对“a”的承诺或承诺“b”)。所以我期待Thing.fetch(1)返回“b”的承诺。

Thing.fetch(1)确实会返回一个承诺,但是如果我Thing.fetch(1).valueOf()它会返回一个承诺,而不是我预期的“b”。如果我这样做:

Thing.fetch(1).then(function(foo){
  console.log(foo);
});

它将在控制台上打印“b”。

如果我Thing.promise.valueOf()它返回数组,所以当我调用“fetch”时,我的解析就会得到解决。

所以我的问题是为什么valueOf()在我在“fetch”返回的promise上调用它时返回一个值?

2 个答案:

答案 0 :(得分:0)

似乎你的承诺尚未解决。

没有详细记录,但散落在我发现的维基页面上:

  

valueOf调用默认返回promise本身。

     

valueOf方法对于提供有关的信息非常有用   承诺在事件循环的同一回合。例如,已解决   promises返回其分辨率值并拒绝返回一个对象   这是由isRejected识别的。

     

如果履行承诺,promise.valueOf()将返回已履行的承诺   值。如果承诺已经或已经转发给延期承诺,那么   返回最近的延期承诺。对于被拒绝的承诺,   promise.valueOf()返回一个sentinel对象   {rejectedPromise: true, reason: {}}

当你正在进行Thing.fetch(1).then(console.log);时,它当然会在控制台上打印"b" - 这是传递给回调的解析值。但请注意,它将来会调用日志功能!

答案 1 :(得分:0)

因为promise的值是一个数组。 传递给“then”的函数的值将是一些值。 你的fetch方法并没有真正返回一个promise,它正在解决一个promise。