我使用redux-thunk中间件来构建React/Redux应用程序来创建和处理Ajax请求。我有一个经常被触发的特殊thunk,并且我想在启动一个新的之前取消之前启动的任何Ajax请求。这可能吗?使用redux-thunk取消之前的异步操作
5
A
回答
9
一种方法是将这些请求标记为取消,方法是在处理结果之前给它们随机标识并检查其状态。
执行此操作的方法是在第一次调度(在thunk中)为此调用分配随机标识,并在处理结果之前在reducer中检查它。
const actionId = Math.random();
dispatch({type: AJAX_LOAD_CONST, id:actionId })
如果要取消所有的请求都使用
dispatch({type:HANDLE_AJAX_RESPONSE, id:actionId, results: json })
当你要处理的结果,不要忘记发送的ID你的U
和减速机有这样的东西:
function reducer(state = initialState, action) {
switch (action.type) {
case actions.AJAX_LOAD_CONST:
return Object.assign({}, state, { ajax: state.ajax.concat(action.id) });
case actions.CANCEL_ALL_AJAX:
return Object.assign({}, state, { ajax: [] });
case actions.HANDLE_AJAX_RESPONSE:
if (state.ajax.includes(action.id) {
//return state reduced with action.results here
}
return state;
}
}
如果您使用XMLH ttpRequest或它的一个包装器(JQuery?),你也可以自己存储请求并调用request.abort()。如果你使用新的提取API,你就没有这种奢侈,因为承诺缺乏这种行为。
1
您可以让您的动作创建者返回承诺,它将由调度功能返回,然后可以中止它。这里有一个例子:
行动的创建者
function doSomething() {
return (dispatch) => {
return $.ajax(...).done(...).fail(...);
}
}
你的组件
componentDidMount(){
this.previousPromise = this.props.dispatch(doSomething());
}
somefnct() {
this.previousPromise.abort();
}
相关问题
- 1. 取消异步操作
- 2. 非合作取消异步操作
- 3. ASP.NET MVC 2取消异步操作
- 4. 取消异步套接字操作
- 5. .NET取消异步I/O操作
- 6. 使用CancellationTokenSource取消之前的异步任务
- 7. 异步操作中的异步操作
- 8. 使操作异步
- 9. 为什么在异步操作完成之前不会执行同步操作?
- 10. redis消息上的异步操作
- 11. 设计一个通用的可取消异步操作接口
- 12. 使用RxJS同步异步操作
- 13. Swift等待现有的异步操作在开始新异步操作之前完成
- 14. 为什么要在同步操作中使用异步操作?
- 15. 异步操作的使用结果iOS
- 16. 取消不同异步操作的常见方法
- 17. 如何从C#中取消C++/CX中的异步操作
- 18. 在异步操作完成之前解决Promise
- 19. 如何在grunt.initConfig()之前执行异步操作?
- 20. 如何使用actors来实现异步相互独立的可取消操作?
- 21. 在使用NodeJs快速执行呈现之前等待异步操作
- 22. 使用结果调用异步操作
- 23. Redux-thunk异步操作:使用自定义中间件进行异步操作
- 24. 同步GM_xmlhttpRequest异步操作?
- 25. ORMLite异步操作
- 26. 异步httpclient操作
- 27. C#异步操作
- 28. struts2异步操作
- 29. 异步SQL操作
- 30. 在一段时间后取消异步操作WinRT