当react路由器更改时,我们可以取消api响应吗
Can we cancel out api response when the react router is changed?
我在redux中使用相同的形式和状态进行添加和编辑。当我调用api来获取数据进行编辑时,我们在响应到达之前更改路由器以添加表单。所有的表格数据都将自动填写添加项目,因为我使用相同的状态进行添加和编辑。有什么办法可以防止这种情况发生吗?
我的动作创作者:
fetchById: function (entity, id) {
return function (dispatch) {
dispatch(apiActions.apiRequest(entity));
return (apiUtil.fetchById(entity, id).then(function (response) {
dispatch(apiActions.apiResponse(entity));
dispatch(actions.selectItem(entity, response.body));
}
}
}
由于响应延迟,那么selectItem将延迟发送。当我打开表单添加项目时,这个表单会填充来自响应的数据。
Thunks同时获取dispatch
和getState
作为参数。
如果您将当前路由保留在您的状态中,则可以在API回调中检查您是否仍与getState().routing.path
或类似内容在同一页面上,以及return
是否在API调用启动后发生了更改。
如果不保持当前路由的状态,则可以读取组件中的this.context.router
(不要忘记定义contextTypes
来获取它!)并将其传递给操作创建者。然后,动作创建者可以使用router.isActive()
来检查我们在请求前后是否仍在同一路径上。
最后,您可以而不是使用相同的状态来编辑和添加项目。您的状态形状可以看起来像{ drafts: { newItem: ..., 1: ..., 2: ... } }
,您可以将"添加"表单保留在drafts.newItem
中,并根据相应实体的ID保留任何"编辑"表单。这样,它们就不会相互覆盖,而且,作为奖励,可以保留正在进行的编辑,例如,如果您按"上一步",然后再次转到该表单(当然,这取决于您是否希望在用户体验中这样做)。
前几天我看到了这篇博客文章,我想第二部分描述了你在寻找什么。您不一定要取消请求,而是忽略响应。
基本上,您想要创建一个外部reducer,它将跟踪您对具有唯一id的服务器的异步请求。只有当请求id在列表中时,才允许它进入子减速器。
当您切换页面时,您将希望清除此唯一ID列表。
直接从博客上获得:
const initialState = [];
function update(state = initialState, action) {
const { seqId } = action;
if (action.type === constants.UNLOAD) {
return initialState;
}
else if (seqId) {
let newState;
if (action.status === 'start') {
newState = [...state, seqId];
}
else if (action.status === 'error' || action.status === 'done') {
newState = state.filter(id => id !== seqId);
}
return newState;
}
return state;
}
然后限制子减速器:
let store = createStore((state, action) => {
if (action.seqId &&
(action.status === 'done' || action.status === 'error') &&
state &&
state.asyncRequests.indexOf(action.seqId) === -1) {
return state;
}
return reducer(state, action);
});
为此向詹姆斯大声疾呼。真的很好的解决方案,在他的博客文章中解释得很好。
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 如何更改bigquery API中的计费层选项
- jquery点击函数select&取消选择
- Amazon S3 REST API大小不正确
- 客户端服务器REST API captcha实现
- 使用Facebook live API创建实时视频对象时的隐私设置
- 谷歌放置API:按国家或餐馆名称搜索餐馆
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- IE11中的第二个调用取消了第一个Fetch API调用
- 取消FB.api(..)请求
- 当react路由器更改时,我们可以取消api响应吗
- 在角度 api 中$watch返回一个取消注册函数,用于此侦听器取消注册的含义是什么
- 取消以前由 ng-change 创建的 api 请求
- 通过 JavaScript 中的 Web Audio API 静音/取消静音和更改音量
- 如何正确取消Web Audio API中当前正在更改的AudioParam
- 发布/订阅API设计:取消订阅和更新
- 在执行findQuery emberjs和ember data时取消对api的现有调用
- 是否可以使用socket.io取消订阅MtGox API频道
- 在Restangular中取消挂起的API调用