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

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

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

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

非同期処理

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

Ajax

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

Q&A

解決済

2回答

571閲覧

promiseとpromise.allの同期処理におけるthenの挙動

moose1

総合スコア16

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

非同期処理

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

Ajax

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

0グッド

0クリップ

投稿2022/09/18 04:50

前提

ajaxによる関数を同期処理と非同期処理を組み合わせてコードを書いています。
そこでthenによる挙動が思い通りにいかないのでご教示いただきたいです。

実現したいこと

実行されるメソッドの順番が

  1. getData1()
  2. getData2(id)*10(非同期処理)
  3. then

となるようにしたいです。
以下のコードを実行すると、1が完了した後に3が実行されてしまいます。2の処理を待ってからthenを実行するにはどのようなコードを書けばよろしいでしょうか。

該当のソースコード

javascript

1const getData1= () => { 2 return new Promise((resolve, reject) => { 3 $.ajax({ 4 type: 'GET', 5 url: URL1, 6 dataType: 'jsonp', 7 data: { 8 menu: menu 9 }, 10 }) 11 .done(function(out){ 12 resolve(out.data) 13 }) 14 .fail(function() { 15 console.log('エラー') 16 reject() 17 }) 18 }) 19} 20 21const getData2= (id) => { 22 return new Promise((resolve, reject) => { 23 $.ajax({ 24 type: 'GET', 25 url: URL2, 26 dataType: 'jsonp', 27 data: { 28 id: id 29 }, 30 }) 31 .done(function(out){ 32 resolve(out.data) 33 }) 34 .fail(function() { 35 console.log('エラー') 36 reject() 37 }) 38 }) 39} 40 41(async () => { 42 await getData1() 43 const ids = [...Array(10).keys()] 44 45 await Promise.all([ 46 ids.map(async (id) => { 47 getData2(id) 48 }) 49 ]) 50 .then(() => { 51 console.log("after promise.all") 52 }) 53})()

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問にある

3.then

の直前のawait Promise.all(・・・) のところは下記でよいかと思います:

diff

1- await Promise.all([ 2- ids.map(async (id) => { 3- getData2(id) 4- }) 5- ]) 6+ await Promise.all(ids.map(getData2))

以下にて上記のコードを動作確認できます。

上記のデモでは、getData1およびgetData2の実際にAPIをリクエストするところをsetTimeoutを使ったモック的なものに置き換えてます。getData2が返す各Promiseがresolve されるまでの時間をランダムに変えることで、Promise.all によってすべてのPromiseがresolveされてからthenのコールバックが実行されることを確認するようにしています。

投稿2022/09/18 06:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moose1

2022/09/18 06:56

ご回答の方法を自身の環境上で試したところ、うまく実行されました。 デモまで用意していただきありがとうございます。 なぜうまくいくのかまだ理解が追いついていませんのでpromiseについて勉強をしていきたいと思います。
退会済みユーザー

退会済みユーザー

2022/09/18 07:19

理解のために > promiseについて勉強 したのち、下記を整理するとよいかと思います。 まず第1に 1) Promise.all() の引数にはPromiseの配列を渡す必要がある ということです。(質問にあるコードはそうなっているでしょうか?) 次に、 2) ids をmap することによって 1) の Promise.all() に渡すPromiseの配列を作りたい ということならば、 3) では ids.map(fn) するときに map に渡す関数 fn について  - fn の第一引数は何か?  - fn は何かを返さなければならないのか?返さなければならないとすれば何を返さなければならないか? 4) 3)の要件を満たすように map に渡す関数 fn を書けば、 ids.map(id => { return fn(id); }) と書く必要がなく ids.map(fn) と書いて済ませられる。       といった点を点検するとよいでしょう。
guest

0

js

1 await Promise.all([ 2 ids.map(async (id) => { 3 getData2(id) 4 }) 5 ])

この部分ですが、mapの引数とした関数がgetData2(id)の結果と関連を持たないため、中でgetData2が生成したPromiseはただ捨てられます。

getData2の前にawaitを書くか、id => getData2(id)Promiseを返り値とするかをしましょう。

投稿2022/09/18 04:58

編集2022/09/18 05:01
maisumakun

総合スコア145184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問