質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

554閲覧

jQuery の非同期処理を勉強中でして、納得できないところについて教えて頂けませんでしょうか

huyumin

総合スコア16

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/08/23 16:12

先日からjQueryの非同期処理について少し勉強しはじめた者です。
調べていくうちにいろいろなパターンがあり混乱してしまい、少し整理できればと思いご質問させて頂きます。
どうぞお手柔らかに宜しくお願い致します。

以下すべてのコードはこちらに書いてあります。
https://jsfiddle.net/xdfvzo0n/

###基本的な関数
まず基本的な関数hoo()をご用意しました。この呼び出し方についてのご質問になります。

function hoo(){ var deferred = $.Deferred(); setTimeout(function(){ console.log('2'); deferred.resolve(); },1000); return deferred.promise(); }

###ご質問➀
下記の【A】【B】はどちらも「1→2→3」と同じ結果になるのですが、何が違うでしょうか?
よく区別される使いどころなどの例を教えて頂きたく思います。

【A】

$('.buttonA').click(function(){ $.Deferred().resolve() .then(function(){ console.log('1'); }) .then(function() { return hoo(); }) .then(function() { console.log('3'); }); });

【B】

$('.buttonB').click(function(){ $.when( console.log('1') ) .then(function(){ return hoo(); }) .then(function() { console.log('3'); }); });

###ご質問➁
上の【B】は2つ目のthen()returnしていますが、次の【C】はしていません。
なぜ【C】だと順番の処理ができないのでしょうか?
そして【B】のreturnは、何を返していると考えればいいのでしょうか?

【C】

$('.buttonC').click(function(){ $.when( console.log('1') ) .then(function(){ hoo(); }) .then(function() { console.log('3'); }); });

###ご質問➂
上の【C】のconsole.log('1')hoo()を入れ変えたのが次の【D】です。

なぜ【C】は順番の処理ができず【D】はできるのでしょうか?

そして【D】においては、【A】や【B】のようにreturn hoo()と書かなくてもhoo()だけでできるのはなぜでしょうか?(なぜwhen()の中だとreturnがいらず、then()の中だと必要になるのでしょうか?)

【D】

$('.button3').click(function(){ $.when( hoo() ) .then(function(){ console.log('1') }) .then(function() { console.log('3'); }); });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ご質問➀

よく区別される使いどころなどの例

ドキュメントをお読みいただいた方が早いと思います。
deferred.then() | jQuery API Documentation
jQuery.when() | jQuery API Documentation

大雑把に言うと、jQuery.when()deferred.then()の複数版だと思えばいいでしょう。
複数のdeferredを引数にとりdeferredを返し、全てが成功した時に返したdeferredresolveするものです。
例示のコードとは影響のない部分の違いのため、結果に差異が出ていません。

ご質問➁

なぜ【C】だと順番の処理ができないのでしょうか?

「順番の処理」というのは、「1→2→3」という結果が返ってくる、という意味でよろしいでしょうか。
この部分は、jQueryのドキュメントは少しわかりにくいので、MDNのドキュメントをご参照ください。(同じものではないですが、同じインターフェース?を持ちます)

もしハンドラー関数が・・・
(略)

  • 何も返さなかった場合、 then によって返される Promise は undefined の値で解決します。

(略)

  • 他の pending 状態の Promise オブジェクトを返した場合、 then によって返された Promise の解決/拒絶は、ハンドラーによって返された Promise の解決/拒絶結果に依存します。また、 then によって返された Promise の値は、ハンドラーによって返された Promise の値と同じになります。

Promise.prototype.then() - JavaScript | MDN

おわかりでしょうか? 前者が【C】で、後者が【B】です。
そのため、【B】は「ハンドラーによって返された Promise の解決/拒絶結果に依存し」後から解決されるため「1→2→3」になりますが、【C】は即座に解決されるため「1→2→3」になりません。

そして【B】のreturnは、何を返していると考えればいいのでしょうか?

もちろん、関数hooの戻り値です。このあたりは、通常の関数と変わりがありません。

ご質問➂

なぜwhen()の中だとreturnがいらず、then()の中だと必要になるのでしょうか?

return文は関数から抜け出し戻り値を返すだからです。
文と宣言 - JavaScript | MDN
jQuery.when()が(というか、全ての関数は)引数に取るのはです。
式と演算子 - JavaScript | MDN

なので、「when()の中だとreturnがいらず」というよりも、文法上returnを書くことができません

投稿2019/08/24 02:07

編集2019/08/24 02:31
Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

huyumin

2019/08/24 18:16

ご丁寧にどうもありがとうございます。 ――ご質問➀―― なるほど。わかりました。ありがとうございます。 ――ご質問②―― なるほど。when()→then()→then() とステップを超えるためには、returnがある場合はハンドラーのpromiseを得てから超えて、なければ即超えるわけですね。わかりました。ありがとうございます。 ――ご質問➂―― なるほど。わかりました。 ・関数は式を引数に取る。 ・そして when() は関数で、then() は関数じゃない。 ・だから when() の中は式しか書けず、then() の中は式だけでなく return という文も書ける。 ということはこういう感じでしょうか。 ・関数である when() の中にある式 hoo() は、それを実行するだけで hoo() の戻り値が取得できる。 ・けど、関数じゃない then() の中では hoo() を実行するだけでは戻り値が取得できないから return を書かないといけない。 あれ?ところで ・then() は関数ではなく、何と呼べばいいのでしょうか?
Lhankor_Mhy

2019/08/26 01:09

> then() は関数ではなく、何と呼べばいいのでしょうか? これは私の説明が悪かったです。 then()も関数です。 引数にとっているのは、関数式という関数を表現する「式」です。JavaScriptでは、式の中で関数を表現することができます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/function#Description 関数式の中では return文 を書くことができる(書かない場合が戻り値がundefinedになる)ので、この違いが生まれているとご理解されるのがいいかと思います。
huyumin

2019/08/26 01:25

・関数 when() は「式」を引数にとっていて、このとき return 文は書けない。 ・関数 then() は「関数式」を引数にとっていて、return 文が書ける。 ・そして「関数式」はreturnしないと undefined になる。 なるほど~。本当に基本をきっちり抑えていらっしゃる方な印象です。ありがとうございます。
huyumin

2019/08/26 01:28

>式の中で関数を表現することができます。 と仰いますと、hoo() は「関数」なんだけど、「 then() の中に書いた「関数」」のことは「関数式」と呼ぶ感じでしょうか。 それとも、「 return の後に書いた「関数」」が「関数式」と呼ぶのでしょうか。 むずいですね。 きっと then() 以外にもいろいろな「関数式」があるんですね。 そもそも「関数」や「式」や「関数式」など用語と役割を理解する機会を避けてきてしまったので、そんな基本的なことから調べていきたいと思います!
guest

0

質問➀

書き方が違うだけと思います。

diff

1- $.Deferred().resolve() 2+ $.when(

質問➁

順番の処理ができないのは【C】がreturnしてないからです。
【B】のreturnが返す値はconsole.log(hoo())とすればわかります。

他の質問で他の方に関数呼び出しを説明したことがありますが、関数呼び出しをご理解されていないと思われます。

関数呼び出しは

JavaScript

1function test(a) { 2 return a+1; 3} 4 5var x = test(1); /* test関数が2を返して(returnして)変数xに2を代入 */ 6var y = test(2); /* test関数が3を返して(returnして)変数yに3を代入 */ 7var z = test(3); /* test関数が4を返して(returnして)変数zに4を代入 */

ということです。

質問➂

順番の処理ができないのは【C】がreturnしてないからです。

returnfunctionはJavaScriptの予約語で特別な意味があります。
関数呼び出しのreturnfunctionを学んでください。

投稿2019/08/24 01:02

querykuma

総合スコア777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

huyumin

2019/08/24 18:19

どうもありがとうございます。関数呼び出しのコメントアウト、わかりやすかったです。returnやfunctionなでょ初歩的なことに立ち戻ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問