我有一个对象,其值来自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上调用它时返回一个值?
答案 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。