1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptのDeferred、Promise、Futureの違いは何ですか?

2022-03-29 15:31:24

質問

Deferreds、Promise、Futuresの違いは何ですか?

この3つには、一般的に認められた理論があるのでしょうか?

解決方法は?

私がOPの質問に答えようとした方法について、明らかに不愉快に思っていることを考慮に入れて。文字通りの答えは、プロミスは他のオブジェクトと共有されるものであり、ディファードはプライベートに保たれるべきものであるということです。主に、遅延(一般にPromiseを拡張したもの)は自己解決することができますが、promiseはそうすることができないかもしれません。

細かいことにこだわるなら プロミス/A+(エープラス .


私が知る限り、その包括的な目的は、標準化されたインターフェイスによって明確性を向上させ、結合を緩めることです。参照 参考文献 jfriend00 さんより。

関数に直接コールバックを渡すよりも プロミスを使用することで、インターフェイスを密結合にすることができます。 同期と非同期のコードに対する懸念を分離することができます。

個人的には、deferredは、例えば、非同期リクエストによって入力されるテンプレート、依存関係のネットワークを持つスクリプトのロード、ノンブロッキングでフォームデータに対するユーザーフィードバックを提供する場合などに特に有用であると感じています。

確かに、CodeMirrorをJSモードで非同期に読み込んだ後に何かを行う純粋なコールバック形式を比較すると(申し訳ありませんが、私はjQueryを使ったことがありません。 ):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

約束されたバージョンに(また、申し訳ありませんが、私はjQueryの最新のものではありません)。

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

半擬似的なコードで申し訳ありませんが、これで核となる考え方がいくらか明確になるかと思います。基本的には、標準化されたプロミスを返すことで、プロミスを受け渡しすることができ、その結果、より明確なグループ分けが可能になります。