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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

4回答

1655閲覧

どの部分が前回の非同期通信なのか

aaaaaaaa

総合スコア501

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/07/20 09:50

編集2018/08/03 10:06

下記の引用は、ブレイクスルーjavascript初版96頁に記述されているものを一部抜粋したものです。

〇Promise/Deferredを使った非同期通信

javascriptにおける非同期通信は、昨今のwebアプリケーションの進化を大きくけん引してきたといっても過言ではありません。しかし、その便利さとは裏腹に、非同期通信で受け取ったレスポンスをコールバックで処理するというシステムは時に複雑を極めます。
次のコードは、「asyncFuncA >asyncFuncB >asyncFuncCの順に、前回の非同期通信完了を待ってから実行する」という処理の例です。

javascript

1asyncFuncA (function(a){ 2 asyncFuncB (function(b){ 3 asyncFuncC(function(c){ 4 console.log(c); 5 },function(error){ 6 console.log(error); 7 }) 8 },function(error){ 9 console.log(error); 10 }) 11},function(error){ 12 console.log(error); 13})

ここで疑問なのですが、書籍の言う前回の非同期通信というのは、ソース中のどれなのでしょうか。

試したソース

javascript

1let asyncFuncA = function(qqq,eee) { 2 //qqqは、入れ子になっているほうの関数 3 qqq("asyncFuncA関数の仮引数であるqqq関数を実行"); 4 eee("asyncFuncA関数の仮引数であるeee関数を実行"); 5 console.log("qqq-a:",qqq,"eee-a:",eee); 6}; 7let asyncFuncB = function(qqq,eee) { 8 qqq("asyncFuncB関数の仮引数であるqqq関数を実行"); 9 eee("asyncFuncB関数の仮引数であるeee関数を実行"); 10 console.log("qqq-b:",qqq,"eee-b:",eee); 11}; 12let asyncFuncC = function(qqq,eee) { 13 qqq("asyncFuncC関数の仮引数であるqqq関数を実行"); 14 eee("asyncFuncC関数の仮引数であるeee関数を実行"); 15 console.log("qqq-c:",qqq,"eee-c:",eee); 16}; 17 18asyncFuncA(function(a){ 19 console.log("実引数a",a); 20 asyncFuncB(function(b){ 21 console.log("実引数b",b); 22 asyncFuncC(function(c){ 23 console.log("実引数c",c); 24 },function(error){ 25 console.log("実引数error-c",error); 26 }); 27 },function(error){ 28 console.log("実引数-error-b",error); 29 }); 30},function(error){ 31 console.log("実引数error-a",error); 32});

https://ja.stackoverflow.com/questions/47216/%E3%81%A9%E3%81%AE%E9%83%A8%E5%88%86%E3%81%8C%E5%89%8D%E5%9B%9E%E3%81%AE%E9%9D%9E%E5%90%8C%E6%9C%9F%E9%80%9A%E4%BF%A1%E3%81%AA%E3%81%AE%E3%81%8B

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

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

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

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

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

guest

回答4

0

ベストアンサー

asyncFuncA,B,Cは非同期通信のメソッドであるとします。(通信であることはそこまで重要ではないと思っておりますので、あくまで非同期処理についての説明になると思います。)

例えば、以下のようにasyncFuncA,B,Cを順番に呼んだとします。

asyncFuncA(function(a){ console.log("実引数a",a); },function(error){ console.log("実引数error-a",error); }); asyncFuncB(function(b){ console.log("実引数b",b); },function(error){ console.log("実引数-error-b",error); }); asyncFuncC(function(c){ console.log("実引数c",c); },function(error){ console.log("実引数error-c",error); });

なので、前回の非同期通信と言うのはasyncFuncBから見るとasyncFuncA、asyncFuncCから見るとasyncFuncBが前回の非同期通信と言えるでしょう。
すると、それぞれの処理は非同期に行われるため、asyncFuncAの結果が返ってくる前にasyncFuncBもasyncFuncCも実行されることになり、例えばAの処理が遅くてBの方が結果が返ってくるのが早ければ
実引数b、実引数a、実引数cのような順で表示されるかもしれません。

では、前回の非同期通信を待ってから次の非同期通信を呼ぶような処理をしていく説明をしていきます。
asyncFuncAを取り出してみます。

asyncFuncA(function(a){ console.log("実引数a",a); },function(error){ console.log("実引数error-a",error); });

asyncFuncAは非同期通信であるとすると、通信が返ってくるとconsole.log("実引数a",a);が呼ばれるようになっています。なのでasyncFuncAの通信が返ってきてからasyncFuncBを呼びたいとした場合(前回の非同期通信が終わってから呼び出したい)

asyncFuncA(function(a){ // asyncFuncAの通信が終わるとここに入ってくる!!! console.log("実引数a",a); asyncFuncB(function(b){ console.log("実引数b",b); },function(error){ console.log("実引数-error-b",error); }); },function(error){ console.log("実引数error-a",error); });

こんな風に書くと必ずasyncFuncAが終わってからasyncFuncBを実行させることができると言うことなんですねー。

実際にはasyncFuncAには非同期通信の処理は書かれていないのでこのままプログラムを動かして結果を得るようなことはできませんが、あくまで非同期処理とその完了を待ってからプログラムを動かすと言うことがどのようなことがしたいかについてご説明させていただきました。

以上ですが、求めていた回答になっていますでしょうか?
何かわからない点があればコメントください。

投稿2018/08/08 06:12

razuma

総合スコア1313

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

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

0

ソースコードにはコールバックを記載しているように見えますが非同期通信は書かれていないと思います

投稿2018/07/23 11:09

you21979

総合スコア71

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

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

0

転機していただいたソースが本当に書いてあるならあまりいい例示では
ないようです。
その例を題材に「前回の非同期通信」を説明するのは無理があるとおもいます

投稿2018/07/20 10:18

yambejp

総合スコア114779

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

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

aaaaaaaa

2018/07/23 09:52

ご回答ありがとうございます。 重ね重ね申し訳ありませんが、それは、何故なのでしょうか。
guest

0

折角コードがあるのでしたら実行して確認してみたら良いのでは。

投稿2018/07/20 21:18

m.ts10806

総合スコア80850

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

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

aaaaaaaa

2018/07/23 09:51

ご回答ありがとうございます。96頁のソースのままだとエラーがでるのであっているかわかりませんが、追記して実行しました。 しかし、何がどうasyncFuncA >asyncFuncB >asyncFuncCの順に、前回の非同期通信完了を待ってから実行する、のか分かりませんでした。 当該のソースは、質問文に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問