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

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

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

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

Q&A

解決済

3回答

455閲覧

javascript for文でのpromise

art_porokyu

総合スコア44

JavaScript

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

1グッド

1クリップ

投稿2020/03/08 05:22

#javascript for文でのpromise

##コード

javascipt

1smapleFor() { 2 const resultArray = [] 3 const hoge = new Promise(resolve => { 4 for (let i = 0; i < 6; i++) { 5 axios 6 .get( 7 'https://script.google.com/macros/s/AKfycbyelRmE8FAZ7qXEZO7J0WzD_wuiCwZVlxIrxLrwMLXBHiPqdHm4/exec' 8 ) 9 .then(response => { 10 const myPromise = response.data[i].name 11 resultArray.push(myPromise) 12 resolve(resultArray) 13 }) 14 .catch(err => { 15 console.log(err) 16 }) 17 } 18 }) 19 hoge.then(val => { // 後続の処理 20 console.log(val) 21 }) 22 },

##やりたいこと
これはあくまで例なのですが、スプレッドシートから出力させたものを配列にpushし、それを後続の処理で使いたいのですが配列に一個格納された時点でresplveしてしまい、うまくいきません。

配列に全てデータをpushしてから後続の処理をさせたい場合どのようにすればいいでしょうか?

wordress1👍を押しています

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

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

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

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

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

guest

回答3

0

配列に全てデータをpushしてから後続の処理をさせたい場合どのようにすればいいでしょうか?

いったん.mapPromiseの配列を作って、Promise.all(配列).then(resolve)のように、「全部揃ったらresolveする」ようなコードを書いてください。

投稿2020/03/08 06:27

maisumakun

総合スコア146018

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

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

art_porokyu

2020/03/08 06:37

ありがとうございます。 やってみます。
art_porokyu

2020/03/08 09:08

やってみました。 がundefindeになりうまくいきません。 考え方が間違っていますでしょうか? ```javascript smapleFor() { const resultArray = [] const hoge = new Promise(resolve => { for (let i = 0; i < 6; i++) { axios .get( 'https://script.google.com/macros/s/AKfycbyelRmE8FAZ7qXEZO7J0WzD_wuiCwZVlxIrxLrwMLXBHiPqdHm4/exec' ) .then(response => { const myPromise = response.data[i].name resolve(myPromise) }) .catch(err => { console.log(err) }) } }) hoge.then(val => { // promiseの配列を作る const promiseArray = Promise.map(resultArray, () => { resultArray.push(val) }) // allで完了まで待つ Promise.all(promiseArray).then(array => { console.log(array) }) }) }, ```
guest

0

自己解決

javascript

1smapleFor() { 2 const promises = [] 3 for (let i = 0; i < 6; i++) { 4 promises.push(this.createPromise(i)) 5 } 6 Promise.all(promises).then(responses => { 7 console.log(responses) 8 }) 9 }, 10 createPromise(i) { 11 return axios 12 .get( 13 'https://script.google.com/macros/s/AKfycbyelRmE8FAZ7qXEZO7J0WzD_wuiCwZVlxIrxLrwMLXBHiPqdHm4/exec' 14 ) 15 .then(response => { 16 const userData = response.data[i].name 17 return Promise.resolve(userData) 18 }) 19 .catch(err => { 20 return Promise.reject(err) 21 }) 22 },

Promise.allに配列を入れました。

投稿2020/03/08 14:37

art_porokyu

総合スコア44

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

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

0

もし、要素を全て配列へpushしてresolveしたいのであれば、resolve(resultArray)をfor文のあとに置けばよいかと思います。ちなみに、今のままでは要素一つに対して逐一resolve(resultArray)を行う仕様になっています。

投稿2020/03/08 05:41

SanQ

総合スコア92

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

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

art_porokyu

2020/03/08 05:52

ありがとうございます。 やってみたのですが、空の配列が出力されるだけでした。 promiseの書き方に問題があるのでしょうか・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問