在反应可观察中使用史诗的一个输出作为史诗的另一个输入



我正在使用react-observable来开发一个react-native应用程序。

我有两个史诗,一个用于获取经纬度,另一个用于通过经纬度获取地址。

我的问题是,由于我想在一个史诗中做一件事,我如何使用第一个史诗的输出作为第二个史诗的输入?

const getLocationEpic = action$ =>
action$.ofType('GET_LOCATION')
.mergeMap(() =>
currentPosition$()
.map(data => ({
type: 'GET_LOCATION_SUCCESS',
data: {"latitude": data.coords.latitude, "longitude": data.coords.longitude}
}))
.catch(error => {
console.log("GET POSITION ERR", error);
return Observable.of({type: 'GET_POSITION_ERROR', error: error});
})
);
const getAddressEpic = action$ =>
action$.ofType('GET_ADDRESS')
.switchMap(action =>
ajax(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`)
.map(data => (data))
.do({
next: data => {
console.log("address data");
console.log(data);
}
})
.map(data => ({
type: 'GET_POSITION_SUCCESS', data: data.response.results[0].formatted_address
}))
.mergeMap(() =>
currentPosition$()
.map(data => ({
type: 'GET_ADDRESS_SUCCESS',
data: {"latitude": data.coords.latitude, "longitude": data.coords.longitude}
}))
.catch(error => {
console.log("GET_ADDRESS_ERROR", error);
return Observable.of({type: 'GET_ADDRESS_ERROR', error: error});
})
));

可能是这样的:

getLocationEpic(action)
.mergeMap( (action) => getAddressEpic(action) )
.subscribe( (data) => {
/* get the result from epic 1 to epic 2 */
})

细节:获取getLocationEpic的结果,然后将其展平并将结果输入getAddressEpic。订阅它以获得最终结果。

在 redux-observable 中,您的史诗会收到调度的所有操作的流 - 可能不明显的是,这包括其他史诗调度的操作。这是一个非常强大的功能,因为您可以编写不需要与其他史诗中的实现细节耦合的史诗。行动就是合同。

在你的例子中,你说你想把它们排序为1。 获取经度/纬度 2.然后使用该长/纬度来获取他们的地址。

然后,您的getAddressEpic只需要侦听GET_LOCATION_SUCCESS通知并接收长/纬度值。

const getAddressEpic = action$ =>
action$.ofType('GET_LOCATION_SUCCESS') // <--- listen for location success action
.switchMap(action =>
// you can now use the long/lat from that action
ajax(`${apiURL}/geocode/json?latlng=${action.data.latitude},${action.data.longitude}`)

相关内容

最新更新