- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 redux-observable 中,我需要在执行 API 请求之前等待,直到另一个史诗完成。使用 combineLatest 不起作用,APP_INITIALIZED 完成后没有任何反应。我也试过 withLatestFrom 但都不起作用。
const apiGetRequestEpic = (action$, store) => {
return Observable.combineLatest(
action$.ofType('APP_INITIALIZED'),
action$.ofType('API_GET_REQUEST')
.mergeMap((action) => {
let url = store.getState().apiDomain + action.payload;
return ajax(get(url))
.map(xhr => {
return {type: types.API_RESPONSE, payload: xhr.response};
})
.catch(error => {
return Observable.of({ type: 'API_ERROR', payload: error });
});
})
);
};
最佳答案
一种方法是(使用伪名称),当接收到初始操作 API_GET_REQUEST
时,您会立即开始监听单个 INITIALIZE_FULFILLED
,这表明初始化(或其他任何) 已经完成——我们稍后会开始。收到后,我们 mergeMap
(或 switchMap
以您的用例为准)进入我们的调用以发出其他 ajax 请求并执行通常的业务。最后,启动我们正在等待的实际初始化的技巧是在整个链的末尾添加 startWith()
——这将发出和分派(dispatch)另一个史诗正在等待的 Action .
const initializeEpic = action$ =>
action$.ofType('INITIALIZE')
.switchMap(() =>
someHowInitialize()
.map(() => ({
type: 'INITIALIZE_FULFILLED'
}))
);
const getRequestEpic = (action$, store) =>
action$.ofType('API_GET_REQUEST')
.switchMap(() =>
action$.ofType('INITIALIZE_FULFILLED')
.take(1) // don't listen forever! IMPORTANT!
.switchMap(() => {
let url = store.getState().apiDomain + action.payload;
return ajax(get(url))
.map(xhr => ({
type: types.API_RESPONSE,
payload: xhr.response
}))
.catch(error => Observable.of({
type: 'API_ERROR',
payload: error
}));
})
.startWith({
type: 'INITIALIZE'
})
);
您没有提到一切是如何工作的,所以这只是伪代码,您需要根据您的用例进行修改。
总而言之,如果您只在这个位置调用初始化,您也可以将该代码直接包含在单个史诗本身中,或者只创建一个对其进行抽象的辅助函数。将它们作为单独的史诗通常意味着您的 UI 代码可以独立触发它们中的任何一个——但出于测试目的将它们分开可能仍然是好的。只有您可以调用电话。
const getRequestEpic = (action$, store) =>
action$.ofType('API_GET_REQUEST')
.switchMap(() =>
someHowInitialize()
.mergeMap(() => {
let url = store.getState().apiDomain + action.payload;
return ajax(get(url))
.map(xhr => ({
type: types.API_RESPONSE,
payload: xhr.response
}))
.catch(error => Observable.of({
type: 'API_ERROR',
payload: error
}));
})
.startWith({ // dunno if you still need this in your reducers?
type: 'INITIALIZE_FULFILLED'
})
);
关于javascript - 如何延迟一个史诗直到另一个史诗发出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426908/
我希望创建一个 redux-observable 史诗,它可以独立于我的应用程序的其余部分。它需要: 监听 { type: "SOCKET_TRY_CONNECT"} 的传入操作,这也可能会忽略连接时
我希望创建一个 redux-observable 史诗,它可以独立于我的应用程序的其余部分。它需要: 监听 { type: "SOCKET_TRY_CONNECT"} 的传入操作,这也可能会忽略连接时
This blog JIRA 中有史诗的定义: Epics are significantly larger bodies of work. Epics are feature-level work
我有一个 Azure DevOps 项目,我们正在其中与 Azure-Boards 进行内部协作。我们与外部用户(即无权访问我们的 Azure-Boards/项目的供应商)共享一些任务/错误。我们也不
可能是我是一个菜鸟,还没有完全理解这些东西应该如何工作,但是我在 redux-observable 中有一个史诗,我想用它作为一种方式来创建一个 promise ,它将调度一个 Action 并等待一
这个问题可能是关于redux-observable或 rxjs或两者。 我正在寻找一种通过特定 Action 开始、停止或恢复史诗的方法。例如,当操作 {type: 'START'} 时,史诗(已经是
我想创建一个在开始工作之前监听明确的 Action 序列的史诗。 此史诗在第一次完成后也不需要存在。 我想象的是这样的: function doTheThing(action$) { return
我有一个界面,用户可以在其中触发对同一端点但具有不同参数(在本例中为 UUID)的调用。到目前为止,我一直很享受 switchMap 的行为,每当我发送一个具有相同类型的新 redux 操作时取消我的
我是一名优秀的程序员,十分优秀!