其实取消请求对于普通的ajax
请求rn-fetch-blob
写法是比较简单的
let task = RNFetchBlob.fetch('GET', 'http://example.com/file/1')
task.then(() => { ... })
// handle request cancelled rejection
.catch((err) => {
console.log(err)
})
// cancel the request, the callback function is optional
task.cancel((err) => { ... })
但是我们的整个应用结合了redux
,不可能直接在组件中调用ajax
请求,那么我们的action
可能是这样的:
export const login = (data) => dispatch => {
//ajax 是我们自己封装的方法,但是底层还是rn-fetch-blob,返回的依然是一个promise
let promise = ajax.post({
url:"/user/login",
data:data
});
//这里返回的payload是只有ajax的数据
promise.then(payload=>{
dispatch({type:"LOGIN_SUCCESS",payload});
});
return promise;
};
每一个action
这样干其实很恶心,都要做这样的两个操作,效率没提高,反而多了很多的冗余代码
想了想,干脆自己写个中间件来处理这个吧
当当当当 fetch-blob-redux-middleware 诞生
加入fetch-blob-redux-middleware
后的action
写法:
//createAction 为第三方的小插件,使用redux-actions 或者 create-action 都可以
export const login = (data) => createAction("LOGIN_SUCCESS",()=> ajax.post({
url:"/user/login",
data:data
}));
是不是简介了很多,写代码速度估计也会快很多,当然在写fetch-blob-redux-middleware
的时候我做了兼容处理,也支持以前的普通的ajax
调用方法,所以大家放心的用吧
当然大家也可以根据需要自己写redux middleware
,很简单的