我有一个对象,其值来自 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
};
}());
事物在加载时执行并运行“刷新”以最初填充自身。“fetch”函数的重点是我的异步请求(在这种情况下为 Q.all)返回一个数组的承诺,但我真正想要的是数组中元素的承诺(例如“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”时,promise 就解决了。
所以我的问题是,当我在“fetch”返回的承诺上调用 valueOf() 时,为什么不返回一个值?