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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

Q&A

解決済

1回答

364閲覧

非同期処理の順番が思うようにいかない

masa207

総合スコア22

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

0グッド

0クリップ

投稿2022/11/01 11:39

質問失礼いたします。

現在、Vue.jsでアプリを開発中なのですが、API1で取得した番号をAPI2にパラメーターを投げてdataArrayの値を出力したと思っているのですが、axiosの非同期処理を使っている関係で最終的なdataArrayは空の状態となってしまいます。setTimeoutで1秒後にconsole.logすると値が入っています。
setTimeoutを使わずにデータを非同期処理を順番に実行する方法が分からず何か良い方法はございますでしょうか?アプローチ自体間違えていますでしょうか?

javascript

1<script lang="ts"> 2 import { ref } from "#imports"; 3 import axios from 'axios'; 4 5 export default { 6 setup() { 7 let dataArray = ref([]); 8 axios.get( 9 'http://〇〇api1', 10 ).then(response => { 11 let hoge = []; 12 for( let i = 0; i < response.data.ships.length; i++ ) { 13 hoge.push(response.data.ships[i].ship_id); 14 } 15 hoge.forEach(el => { 16 let params = new URLSearchParams(); 17 params.append('user_id', el); 18 axios.post( 19 'http://〇〇api2', 20 params 21 ).then(response => { 22 dataArray.value.push(...response.data.users); 23 }); 24 }); 25 }); 26 // setTimeout(() => { 27 dataArray.value.sort((a, b) => { 28 return a.user_id < b.user_id ? -1 : 1; 29 }); 30 console.log(dataArray.value); 31 // }, 1000); 32 return { 33 ref, 34 dataArray 35 }; 36 }, 37 }; 38</script>

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

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

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

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

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

guest

回答1

0

ベストアンサー

hoge.forEach()axios.post() を実行していますが、これを hoge.map() にして axios.post() が返す Promise の配列を作り、Promise.all() ですべての Promise が解決するのを待ってから dataArray.value の処理を行いましょう。

投稿2022/11/01 11:58

int32_t

総合スコア20884

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

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

masa207

2022/11/01 12:50 編集

ありがとうございます。 hoge.map()にするところまで行ったのですが、この後の処理でどのように書けばいいか分からずこのようなコードでいいのでしょうか? let fugas = ref([]); axios.get( 'http://35.79.14.242/api/manager/ships', ).then(response => { let hoge = []; for( let i = 0; i < response.data.ships.length; i++ ) { hoge.push(response.data.ships[i].ship_id); } let foo = hoge.map((el) => { let params = new URLSearchParams(); params.append('ship_id', el); axios.post( 'http://35.79.14.242/api/manager/ships/sailors', params ).then(response => { return response; }); }); console.log(foo); }); // setTimeout(() => { fugas.value.sort((a, b) => { return a.user_id < b.user_id ? -1 : 1; }); console.log(fugas.value); // }, 1000); return { ref, fugas };
int32_t

2022/11/01 13:15

map() に指定する関数は値を返さないといけません。この場合は axios の Promise を返したいので、return axios.post(...); です。中に then は不要です。 その後、Promise.all(foo).then(...) です。
masa207

2022/11/01 13:52

ありがとうございます。 ご指示いただいた内容で全てのデータを取得する事は出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問