前置き
非同期通信まわりって
結構むずかしいですよね?、、、
どれが何の役割で
どこに書いて、
どれと何を組み合わせれば良いの!?🙄💦
と思った人は私だけではないはず。。。
async
とasyncData
って何が違うの?try
と.then
って似てるような?
最初はとにかく混乱しました😂笑
それぞれの役割を確認し、
ベースのコードに肉付けしていき、
コードを書く流れが
分かるようにしました🙌💕
⬇️過去記事で詳細を確認したい方はこちら
【Nuxt.js】Nuxt文法編:非同期通信やasyncDataの使い方
【Nuxt.js】Nuxt文法編:try/catch
【Nuxt.js】Nuxt文法編:fetch
【Nuxt.js】nuxt/axiosを導入しよう
役割
非同期通信のグループ化
あくまでもグループ化だけで
通信自体は他の物に任せます🙏methods
発火など
アクションを起こさずとも
非同期通信したい時に使います💡
asyncData
は return
で値を返す時、Vuex
を使用しない時fetch
は
値を返さない時Vuex
を使用する時に使います🍀
asyncData
1 2 3 4 5 6 7 |
<script> export default { asyncData () { // 通信 return {} } </script> |
fetch
1 2 3 4 5 6 7 |
<script> export default { async fetch ({ store }) { store.commit('hoge') }, } </script> |
通信とPromise
通信
axios
データの通信自体をするものなのでasyncData
, fetch
内で使用
1 2 3 4 5 6 7 8 |
<script> export default { asyncData ({ $axios }) { const data = $axios.$get('https://jsonplaceholder.typicode.com/posts') return { data } }, } </script> |
Promise(.then/.catchまたはasync/awaitを使用)
.then/.catch
Promise
です。axios
の通信に対してなので、axios
の後ろに書きます✍️
通信が成功した場合が.then
通信でエラーの場合が.catch
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<script> export default { asyncData ({ $axios }) { return $axios.$get('https://jsonplaceholder.typicode.com/posts') .then ((res) => { return { res } }) .catch ((error) => { console.log(error) }) }, } </script> |
async/await
必ずセットで使用💫async
が非同期通信するものでawait
がPromise
=空のデータが返ることを防ぐ.then
の代わりにもなるので、.then/.catch
またはasync/await
どちらか1つを使用します🍀
async
は非同期を担うのでasyncData
部分に書き、await
は通信をするaxios
部分に書きます✍️
1 2 3 4 5 6 7 8 |
<script> export default { async asyncData ({ $axios }) { const data = await $axios.$get('https://jsonplaceholder.typicode.com/posts') return { data } }, } </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<script> export default { methods: { async submit () { try { const user = await this.$fire.firestore.collection('sample') .add({ user: this.user // data内のuserオブジェクトを送信 }) console.log(user) } catch (error) { console.log(error) } }, }, } </script> |
その他
try/catch
例外処理、
エラーハンドリング
非同期通信のasync
に対しての
実行式になるので、async
でネストさせて書きます✍️
1 2 3 4 5 6 7 8 9 10 11 |
<script> export default { async asyncData ({ $axios }) { try { // 通常の実行式 } catch (error) { // 例外の実行式 } }, } </script> |
流れ
asyncData
非同期通信のグループ化
ベースはこんな感じ
1 2 3 4 5 6 7 8 9 10 11 |
<template> <div class="page"> </div> </template> <script> export default { asyncData () { return {} } </script> |
axios
asyncData
は
あくまでもグループ化するだけなので
肝心の通信自体はaxios
で行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<template> <div class="page"> {{ posts }} </div> </template> <script> export default { asyncData ({ $axios }) { const posts = $axios.$get('https://jsonplaceholder.typicode.com/posts') return { posts } }, } </script> <style lang="scss" scoped> .page { } </style> |
Promise
ただこれだと、axios
からデータが返ってくる前に、
空のデータを返してしまうことがあります。
それを防ぐためのPromise(await)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<template> <div class="page"> {{ posts }} </div> </template> <script> export default { async asyncData ({ $axios }) { const posts = await $axios.$get('https://jsonplaceholder.typicode.com/posts') return { posts } }, } </script> <style lang="scss" scoped> .page { } </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<template> <div class="page"> {{ posts }} </div> </template> <script> export default { asyncData ({ $axios }) { return $axios.$get('https://jsonplaceholder.typicode.com/posts') .then ((posts) => { return { posts } }) .catch ((error)=> { console.log(error) }) }, } </script> <style lang="scss" scoped> .page { } </style> |
.then
の中で更に.then
を使いたい場合try
とasync/await
を使って.then
で右にどんどんズレる現象を
なくしていくことも大事ですね✨🧹
サンプルコード
asyncData, async/await, try, axios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<template> <div class="page"> {{ posts }} </div> </template> <script> export default { async asyncData ({ $axios }) { try { const posts = await $axios.$get('https://jsonplaceholder.typicode.com/posts') return { posts } } catch (error) { console.log(error) } }, } </script> <style lang="scss" scoped> .page { } </style> |
fetch, async/await, axios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<template> <div class="page"> {{ jsonData }} </div> </template> <script> export default { computed: { jsonData () { return this.$store.getters['jsonData'] }, }, async fetch ({ store, $axios }) { const data = await $axios.$get('https://jsonplaceholder.typicode.com/posts') store.commit('setData', data) }, } </script> <style lang="scss" scoped> .page { } </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export const state = () => ({ jsonData: [], }) export const getters = { jsonData: state => { return state.jsonData }, } export const mutations = { setData(state, data) { state.jsonData = data }, } |
まとめ
ややこしいですが
役割を理解するだけで
読み書きのしやすさが
だいぶ変わるかと思います🍀