reactjs - 添加 takeUntil 停止触发所有动作 rxJS, redux-observable
问题描述
我试图找出一种方法来在用户注销后取消所有 HTTP 请求。我创建了一个负责创建 ajax 请求的通用函数。这是功能
const createRequest = (ajaxParameters) => {
return ajax(ajaxParameters).pipe(
takeUntil([ofType("LOGOUT")])
)
};
并且我所有的史诗功能都在导入上述功能来发出 HTTP 请求。我正在做这样的事情
const sendRequest = (url) => {
xhr = createRequest(_.merge({}, requestDefaults, {
method: "GET",
url: url
}, token))
xhr.pipe(
map(
// some code over here and triggering some actions over here
)
)
}
问题是每当我takeUntil
像上面那样添加时,它都会停止触发所有史诗。知道我在这里做错了什么吗?
史诗代码
const fetchUserData = action$ => action$.pipe(
ofType(user.FETCH_USER_DATA.PENDING),
mergeMap(sendRequest(URL_OVER_HERE))
);
解决方案
我不知道那里[ofType("LOGOUT")]
在做什么,但最有可能的是,您想要pipe
关闭action$
:
const createRequest = (ajaxParameters) => {
return ajax(ajaxParameters).pipe(
takeUntil(action$.pipe(ofType("LOGOUT")))
)
};
takeUntil
如果它收到一个值,则完成您的 observable。你拥有它的方式,它可能认为数组是可观察的,值是 operator ofType
。所以它在任何事情开始之前就完成了。这就是为什么您必须改为倾听的原因action$
。
作为另一个优化,您可以立即pipe
关闭xhr
observable:
const sendRequest = (url) => {
createRequest(_.merge({}, requestDefaults, {
method: "GET",
url: url
}, token))
.pipe(
map(
// some code over here and triggering some actions over here
)
)
}
推荐阅读
- c# - JQuery数据表自定义分页分页在排序时重置
- java - 非抽象父类的杰克逊多态反序列化
- ios - 如何在 UITableViewCell 中获取 UIImageView 大小(任何对象,如 UIButton、UILabel)。我使用了自动布局
- ios - 如何使用 swift 使用相同的代码一次创建多个应用程序
- dart - 如何读取win1251编码的文件?
- swift - 如何在 Swift 3 中一一启用和禁用表格视图单元格
- mysql - MySQL - 我如何获得外键
- c# - 即使在刷新根节点后,我们可以保持子节点扩展吗?在c#中
- apache-spark - Spark bulk insert 的 Elasticsearch 索引速度非常慢
- c++ - 在主窗口之前显示登录对话框并隐藏主窗口按钮