なぜ、勝手に状態が変わってしまうのか
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,082
並行して処理を行う非同期的処理を、直列に実行することが出来るものが$.deferredオブジェクトです。
このオブジェクトを作るときは、リテラル表記で、var a = $.deferred();、最初の処理を終了したことを伝えるときは、return a.promise();です。
$.deferred()を返すと、返した先で勝手に状態遷移させられるのを防ぐため、promiseという$.deferredから一部のメソッドを抜いたオブジェクトを返すそうですが、
この「返した先で勝手に状態遷移させられるのを防ぐため」がいまいち、何をいっているのか分かりません。初期状態であるunresolvedから、状態を変更するさいは、a.resolve()かa.reject()と記述する必要がありますが、
returnすると知らない間に、再び状態が変更してしまうということでしょうか。
それと、$.deferredの「$.」は、変数名で利用できる単なる識別子(ドットを除くと、jquery()オブジェクトの略称)だと認識しておるのですが、何故ドルドットなのでしょうか。phpなどで変数を利用するときも、$を使いますが関係はありますか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
返した先で勝手に状態遷移させられるのを防ぐため
aaaaaaaaさん自身がお書きのように、jQuery Promiseは.resolve()
や.reject()
で状態を変更できますが、.promise()
で返したオブジェクトにはこれらのメソッドがない状態となります。ということで、「受け取った側が勝手に.resolve()
や.reject()
を実行して状態が矛盾してしまう」ことを避けられるようになります。
$.deferredの「$.」
jQueryオブジェクトはjQuery
という名前で存在していますが、いちいち書くのが面倒ということもあって、1文字で書ける$
も用意しています。$.deferred
は、jQuery.deferred
の略記です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
出典が不明なので違っているかもしれませんが・・・。
「返した先で勝手に状態遷移させられるのを防ぐため」
これは恐らく、Deferredオブジェクトが内部で保持している状態を、return 先のコードによって誤って変更されてしまう(誤って resolve() や reject() が呼び出されてしまう)ことを防ぐ、というような意味ではないかと思います。
もちろん、比較的小さなプログラムであってすべてを一人でコーディングしているなら、そのようなことは起こらないのが普通ですが、ある程度大きなプロジェクトで多人数のプログラマーによって使われるライブラリを開発しているような場合には、この仕様によって不慮の事故を防ぐことができるということではないでしょうか。
ちなみに、DeferredやPromiseの仕組みは、jQuery以外にもES6、AngularJS、Node.js用のpromiseパッケージ等ありますが、jQueryのように Deferred と Promise の二段階構造になっていないものもあります。例えば ES6 標準のPromiseは二段階構造になっていません。ですから、aaaaaaaaさんがお感じになったように「このような二重構造は不要」という考え方も広く支持されているものと思います。
ご参考になれば。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる