私の反応ネイティブアプリでは、通常、完了するのに1秒未満かかる非常に少量のデータのコレクションをクエリしています。また、通常は5〜10秒で完了する、はるかに大量のデータ(〜1MB)について、別のコレクションに同時にクエリを実行したいと考えています。
私の問題は、小さなクエリが完了する前に大きなコレクションをクエリすると、大きなクエリが完了するまで小さなクエリが完了しないことです。
私の小さな(価格)クエリ:
export const getPrices = () => {
return dispatch => {
dispatch({ type: GETTING_PRICES });
let prices;
firestore
.collection('settings-daily-market')
.orderBy('MarketDate', 'desc')
.limit(1)
.get()
.then(snapshot => {
snapshot.forEach(doc => {
const priceUpdated = moment(doc.data().MarketDate).format(
'MMMM D, YYYY'
);
const Pd = doc.data().PdMarket;
const Pt = doc.data().PtMarket;
const Rh = doc.data().RhMarket;
const PdHedge = doc.data().PdHedge;
const PtHedge = doc.data().PtHedge;
const RhHedge = doc.data().RhHedge;
prices = { Pd, Pt, Rh, PdHedge, PtHedge, RhHedge, priceUpdated };
});
dispatch({ type: FETCH_PRICES, payload: prices });
});
};
};
私のより大きな(カタログ)クエリ:
export const getCatalog = () => {
return dispatch => {
dispatch({ type: GETTING_CATALOG });
let completeCatalog = {};
firestore
.collection('records-catalytic-converters')
.get()
.then(snapshot => {
snapshot.forEach(
doc => (completeCatalog[doc.data().Name] = doc.data())
);
dispatch({ type: GET_CATALOG, payload: completeCatalog });
});
};
};
基本的に、FETCH_PRICES と GET_CATALOG のディスパッチは、一方が (理論上) かなり前に完了しているにもかかわらず、同時に発生します。
これは、私が抱えている別の問題に関連している可能性があるという予感があります。カタログ クエリの .forEach() ループが実行されている間、アプリが応答しなくなり、カタログ クエリの完了後にユーザー入力が登録されます。
forEach ループを非同期にする方法はありますか?