0

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() が値を返さないのはなぜですか?

4

2 に答える 2

0

promise の値は配列であるためです。「then」に渡される関数の値は何らかの値になります。あなたの fetch メソッドは実際には約束を返しているのではなく、約束を解決しています。

于 2013-07-18T21:54:58.320 に答える
0

あなたの約束はまだ解決されていないようです。

十分に文書化されていませんが、私が見つけた wiki ページに散らばっています。

valueOf 呼び出しは、デフォルトで promise 自体を返します。

このvalueOfメソッドは、イベント ループの同じターンで promise に関する情報を提供するのに役立ちます。たとえば、解決された promise は解決値を返し、拒否は isRejected によって認識されるオブジェクトを返します。

promise が満たされている場合promise.valueOf()は、満たされた値を返します。promise が延期された promise である、または転送された場合、最新の延期された promise を返します。拒否され promise.valueOf()た promise の場合、sentinel オブジェクトを返します。 {rejectedPromise: true, reason: {}}

あなたがやっているとき、Thing.fetch(1).then(console.log);それはもちろん"b"コンソールに出力されます - それはコールバックに渡される解決値です。ただし、将来、ログ機能が呼び出されることに注意してください。

于 2013-07-18T21:45:56.957 に答える