【发布时间】:2019-08-09 17:40:50
【问题描述】:
我正在制作一个从 firestore 获取事件对象以将其显示在地图上的应用。
我实现了 redux-saga 对 componentDidMount 上的 firestore API 进行异步调用,以便在地图上显示结果。
我有 3 个操作(LOAD_EVENTS_LOADING/LOAD_EVENTS_SUCCESS/LOAD_EVENTS_ERROR),以便在呈现结果之前显示加载组件。
saga.js:
> import { put, call, takeLatest } from 'redux-saga/effects' import {
> getEventsFromGeoloc } from '../../firebaseAPI/APImethods'
>
> function* fetchEvents(action) {
> try {
>
> const events = yield call(getEventsFromGeoloc, {latMarker : action.payload.latMarker, longMarker: action.payload.longMarker,
> circleRadius: action.payload.circleRadius});
> yield put({type: 'LOAD_EVENTS_SUCCESS', fetchedEvents: events});
> } catch (e) {
> yield put({type: 'LOAD_EVENTS_ERROR', error: e.message});
> } }
>
> export function* eventsSaga() {
> yield takeLatest('LOAD_EVENTS_LOADING', fetchEvents); }
>
> export default eventsSaga;
我的问题是,在我的传奇中,动作“LOAD_EVENTS_SUCCESS”是在 API 调用结束之前调度的。
如何确保在调度“LOAD_EVENTS_SUCCESS”操作之前完成 API 调用? 感谢您的帮助!
这是我的 API 方法:
import firebase from 'react-native-firebase';
import { GeoFirestore } from 'geofirestore';
export const getEventsFromGeoloc = (payload) => {
let events =[]
const geoFirestore = new GeoFirestore(firebase.firestore());
const geoCollection = geoFirestore.collection('events');
const query = geoCollection.near({
center: new firebase.firestore.GeoPoint(payload.latMarker, payload.longMarker),
radius: payload.circleRadius
});
query.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
const idEvent = doc.id
const eventData = doc.data()
events.push({idEvent, eventData})
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
return events;
}
【问题讨论】:
-
Saga 看起来不错。你肯定会从 getEventsFromGeoloc 返回一个承诺吗?也许你什么都不退回?
-
嗨,我正在从 getEventsFromGeoloc API 方法返回一个数组
-
我在
getEventsFromGeoloc的底部看到return events,您可以尝试在收到回复时将其放在.then中吗? -
你整理好了吗?
-
@Adam 是的,我刚刚在下面添加了我的答案。谢谢大家的帮助!