AJAX リクエストから値が取得されるオブジェクトがあります。私はそれをプロミスに変換していますが、予期しないプロミスでいくつかの動作に遭遇しています。ここに同じ動作を示す例がありますが、AJAX 要求を Q.all() に置き換えています。
(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 はロード時に実行され、「refresh」を実行して最初に自身を設定します。「フェッチ」関数の要点は、私の非同期リクエスト (この場合は 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」を呼び出すと約束が解決されます。
だから私の質問は、「フェッチ」によって返されたプロミスで呼び出したときに valueOf() が値を返さないのはなぜですか?