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

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

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

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

非同期処理

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

Q&A

1回答

2180閲覧

Firebaseから値を取得できるのを待ってから次の処理をしたい

ueda_kesuke

総合スコア34

Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

非同期処理

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

0グッド

0クリップ

投稿2020/07/10 06:50

編集2020/07/10 06:55

Firebaseで非同期に値を取得したいです。

現在、以下のようなコードを書いていて、まず snapshot.sizeでFirebase上の値をリッスンしてそれを取得できてから pushの部分で値をpushしたいです。
しかしこのままだと、db.collection ~部分で値を取得する前に blogs.pushの処理に行ってしまい、likeCountがundefinedになってしまいます。

js

1 querySnapshot.forEach(doc => { 2 db.collection('blogs').doc(doc.id).collection('likes').onSnapshot(snapshot => 3 snapshot.size 4 ) 5 6 blogs.push({ 7 id: doc.id, 8 created_at: new Date().getTime(), 9 likeCount: ooo // ここにsnapshot.sizeで取得した値を入れたい 10 })

足りない情報などあれば教えていただけると幸いです????‍♂️
ご教授お願いします????‍♂️

試したこと

以下のようにasync,awaitを加えてみましたがconsole上で[vuex] do not mutate vuex store state outside mutation handlers.エラーが出てしまいました

querySnapshot.forEach(async (doc) => { await db.collection('blogs').doc(doc.id).collection('likes').onSnapshot(snapshot => snapshot.size ) blogs.push({ id: doc.id, created_at: new Date().getTime(), likeCount: ooo // ここにsnapshot.sizeで取得した値を入れたい })

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

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

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

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

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

guest

回答1

0

全体のコードが提示されていないので断定はできないですが、このコードはアクション内で実行されていると仮定して回答します。

第一に、Vuexの記述に問題があります。

[vuex] do not mutate vuex store state outside mutation handlers.のエラーメッセージが言っているように、ステートの値をミューテーション以外から変更することはできません。

質問内のコードでは、アクションから直接ステートを変更しようとしているためエラーメッセージが表示されています。

ステートの値を変更する際には必ずミューテーションを経由してください。

js

1mutations: { 2 add(state, blog) { 3 state.blogs.push(blog) 4 } 5}, 6actions: { 7 fetch({ commit }) { 8 // 中略 9 commit('add', { 10 id: doc.id 11 created_at: new Date().getTime(), 12 likeCount: snapshot.size 13 }) 14 } 15}

次に非同期処理です。
そもそもquerySnapshotが非同期で処理されているかどうかわからないですが、断片的に判断すると次のようになると思います。

js

1querySnapshot.forEach(async (doc) => { 2 const snapshot = await db.collection('blogs').doc(doc.id).collection('likes').onSnapshot() 3 commit('add', { 4 id: doc.id 5 created_at: new Date().getTime(), 6 likeCount: snapshot.size 7 }) 8})

投稿2020/08/21 16:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問