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

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

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

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

JavaScript

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

非同期処理

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

Q&A

解決済

1回答

3636閲覧

vue.js の async/await について

u.sayaka0112

総合スコア38

Vue.js

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

JavaScript

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

非同期処理

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

0グッド

0クリップ

投稿2020/04/23 10:07

前提・実現したいこと

apiと通信してその戻り値の処理がしたいが、非同期処理がうまく行っていない。

該当のソースコード

html

1<button class="test" @click="test">test</button>

javascript

1 methods: { 2 async test() { 3 console.log("test_button"); 4 const result = await setTimeout(function(){ 5 console.log('1!') 6 return 'ok' 7 }, 500) 8 console.log('2!'); 9 }, 10...

result

1testbutton 22! 31!

理想

理想は 1! 2! の順番だと思うのです。何か足りない記述があるかと思い、ググって見ましたが、基本的にはこれのみで非同期に処理ができているようです。ご存知の方がいらっしゃったらご教授いただけると嬉しいです!

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

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

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

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

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

guest

回答1

0

ベストアンサー

特に setTimeout 関数を書き換えたりしていなければ、この関数の返り値は Promise 型ではなく、ただの数値です。したがって、await 構文は期待した動作をしません。

例えば以下のように、Promise オブジェクトを返すよう、setTimeout 関数をラップしてやる必要があります。

javascript

1methods: { 2 async test() { 3 console.log("test_button") 4 // async 関数内で await の次に、Promise オブジェクトが来ると、 5 // その Promise が resolve 又は reject されるまで処理が待機されます。 6 // 多くの非同期処理を行う関数はこの Promise オブジェクトを返すように作られますが、 7 // 残念ながら setTimeout などの古い関数はそのように作られていません。 8 const result = await new Promise(function(resolve, reject) { 9 setTimeout(function() { 10 try { 11 console.log('1!') 12 resolve('ok') 13 } catch (e) { 14 reject(e) 15 } 16 }, 500) 17 }) 18 console.log('2!') 19 } 20 // => test_button 21 // => 1! 22 // => 2! 23}

投稿2020/04/23 12:30

R.Mizukami

総合スコア1086

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

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

u.sayaka0112

2020/04/23 14:34

>Promise オブジェクトを返すよう、setTimeout 関数をラップしてやる必要がある そうなんですね。。ありがとうございます。ちなみに自分で定義した関数についてもpromise でラップする必要があるという認識であっているでしょうか?
R.Mizukami

2020/04/24 08:28

自分で定義するなら、最初から Promise オブジェクトを返すように作ればよいかと思います。 async 構文を利用すると、簡単に Promise オブジェクトを返す関数を作れます。 async function hoge() {} const res = hoge() console.log(res instanceof Promise) // => true
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問