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

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

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

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

Ajax

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

Q&A

解決済

2回答

1240閲覧

for文で動的なimportをループさせたとき、全ての成功を待つには。

hood

総合スコア351

JavaScript

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

Ajax

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

0グッド

0クリップ

投稿2019/07/05 01:33

編集2019/07/05 04:27

###for文で動的なimportをループさせたとき、全ての成功を成功を待つには。
タイトル通りです。
私は以下のようにしてループ内で動的なimportを行おうとしています。

js

1.then(()=>{ 2 for (let item of hoge_list) { 3 import(`../${item}.png`)//変数に応じて動的に取得 4 .then((response) => { 5 //成功したときの動作。 6 }) 7 } 8}.then(response=>{ 9 console.log(response) 10})

しかしこれでは全てのimportの成功を待つことはできないのではないかと思いました。
なのでPromise.allを利用しようとしました。
それぞれのimportを無名変数としてリストにpushし、それをreturnするやりかたです。

js

1.then(()=>{ 2 var f_list = [];//functonのリスト 3 for (let item of hoge_list) { 4 let a = ()=>{ 5 import(`../${item}.png`)//変数に応じて動的に取得 6 .then((response) => { 7 //成功したときの動作。 8 }) 9 }; 10 f_list.push(a) 11 } 12 return Promise.all(f_list); 13}).then(response=>{ 14 console.log(response) 15}) 16

ですがこの結果を見てみると[ƒ, ƒ]というように関数のリストが格納されているだけで、//成功したときの動作。が行われていないことが確認できました。

これはなぜでしょうか?
どうすれば、for文で動的なimportをループさせたとき、全ての成功を待つことはできるのでしょうか?

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

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

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

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

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

yambejp

2019/07/05 01:51

いきなり「.then」から始められても・・・ 最低限実行可能なソースを提示してください そもそもすべてを成功させるというのは 失敗がなければすべて成功するはなしであって、 失敗があったときに、止めるか無視するかその他例外処理するかですよね? 成功の保証の定義をもっとちゃんとしてください
退会済みユーザー

退会済みユーザー

2019/07/05 02:04 編集

↑その通りですね、成功を待つことはできても保証はできないですね。 回答で指摘しようと思ってましたが忘れてました。 言葉は正確に使いましょう。
hood

2019/07/05 04:04

yambejpさん。コメントありがとうございます。 >いきなり「.then」から始められても・・・ .thenの前には大量のPromiseが連なっています。全て書くと複雑になりすぎるのと今回の処理とは関係ない動作だったので、省略させていただきました。そのことをきちんと記すべきだったと思います。 >成功の保証の定義をもっとちゃんとしてください そうですね。定義ができていなかったです。失敗があったときに例外処理をすることです。そのことを書くべきでした。 dyoshikawaさん コメントありがとうございます。 >成功を待つことはできても保証はできない そうですね。言葉の使い方を間違いました。 ご指摘ありがとうございます。あとで修正したいと思います。
guest

回答2

0

ベストアンサー

import って画像読み込みもできるんですか。
webpackでゴニョゴニョしたらできるのかな、ちょっと知らなかったです。

まあimportがPromiseを返しているという仮定でいうと、

let a = ()=>{ import(`../${item}.png`)//変数に応じて動的に取得 .then((response) => { //成功したときの動作。 }) };

ここで無駄に関数に入れたら実行されません。

質問者さんのやろうとしていることが正しければ import() 自体がPromiseを返す関数なので、

const f_list = [] for (const item of hoge_list) { f_list.push(import(`../${item}.png`)) }

こんな感じでPromiseを返す関数を配列に入れていきます。
その後Promise.allすれば処理が終わった後thenの中に入ります。

Promise.all(f_list).then(() => console.log('完了'))

本題ではないですが今回のコードでは変数宣言は全部 const にした方が良さそうです。

投稿2019/07/05 02:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hood

2019/07/05 04:10 編集

回答ありがとうございます。 >import() 自体がPromiseを返す関数 そうだったのですね。importについてまだ理解をしていないと痛感させられました。 具体的なコードものせてくださり、ありがたいです。早速試してみようと思います! >今回のコードでは変数宣言は全部 const にした方が良さそう なるほど・・・いわれてみればそうですね。スコープについてもあやふやな面があるので、もう少しきちんと考えようと思いました。 アドバイスありがとうございました!!
guest

0

importの有効性がちょっとわからないのでfetchしてみるとかでどうしょう?

javascript

1var hoge_list=["hoge","fuga","piyo"]; 2Promise.all( 3 hoge_list.map( 4 x=>fetch(x).then(x=>x.status) 5 ) 6 ).then(res=>{ 7 var message=res.filter(x=>x!=200).length>0?"error":"success"; 8 console.log(message); 9 }); 10

投稿2019/07/05 05:34

yambejp

総合スコア114843

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

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

hood

2019/07/05 05:47 編集

回答ありがとうございます。 以前、私もimportは不自然だなと思ってfetchに置き換えたくて、質問したことがありました。 https://teratail.com/questions/198625 ここで >import()は、コンパイル時に処理されます との回答をいただき、変数をimportのurlに埋め込む私のコードでは、fetchにリファクタリングすることができないのだと結論づけました。 fetchを使える方法は他にあるかもしれませんが、とりあえず動くのでimportでいいかなと思ってます。 コードものせていただき、ありがとうございます。 今後fetchの使い方の参考にさせていただこうと思います。
yambejp

2019/07/05 05:55

受け取る対象が画像で、成功か失敗か見ない(statusのみチェック)なら fetchだと思いますけどね・・・
hood

2019/07/05 06:01

確かに前の質問ではtxtだったからできなかったけど、imgではできるのかもしれませんね。 後で試してみようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問