Javascript 使用TakeTill在Redux中取消异步请求的预期行为是什么

Javascript 使用TakeTill在Redux中取消异步请求的预期行为是什么,javascript,asynchronous,redux,rxjs,redux-observable,Javascript,Asynchronous,Redux,Rxjs,Redux Observable,我是RXJS新手,我发现使用TakeTill取消异步请求非常有用。但是当我测试它的时候,我发现即使我们取消了请求,实际的请求仍然在进行 我有这个JSbin代码段要测试 在这里,即使您通过单击“取消”(多次)按钮取消请求,实际请求也不会取消 我不确定应该是这样的。。如果是,那么取消异步请求意味着什么呢。我有点困惑。。请分享一些想法 对此的任何回复都将不胜感激。。谢谢这个问题很微妙,但显然很重要。根据您的代码: const fetchUserEpic=action$=> 类型的操作$(获取用户)

我是RXJS新手,我发现使用TakeTill取消异步请求非常有用。但是当我测试它的时候,我发现即使我们取消了请求,实际的请求仍然在进行

我有这个JSbin代码段要测试

在这里,即使您通过单击“取消”(多次)按钮取消请求,实际请求也不会取消

我不确定应该是这样的。。如果是,那么取消异步请求意味着什么呢。我有点困惑。。请分享一些想法


对此的任何回复都将不胜感激。。谢谢

这个问题很微妙,但显然很重要。根据您的代码:

const fetchUserEpic=action$=>
类型的操作$(获取用户)

delay(2000)/这个问题非常微妙,但显然很重要。根据您的代码:

const fetchUserEpic=action$=>
类型的操作$(获取用户)

.delay(2000)/这可能对将来的人有所帮助

像上面提到的JayHelps一样,更好的解决方案是使用RXjs AjaxObservable,因为它取消了实际的XMLHttpRequest,而不是忽略响应

但目前RxJS v5“RxJS Observable.ajax跨域问题”中存在一些问题

我找到的好解决方案是“允许绕过默认配置” 如下图所示:

     const fetchUserEpic = action$ =>
              action$.ofType(FETCH_USER)
                .mergeMap(action =>
                  Observable.timer(2000)
                    .mergeMap(() =>
                        Observable.ajax({
                            url:`//api.github.com/users/redux-observable`,
                            crossDomain: true
                        })
                        .do(data => alert(JSON.stringify(data)))
                        .map(fetchUserFulfilled)
                    )
                    .takeUntil(action$.ofType(FETCH_USER_CANCELLED))
                );

这可能对将来的人有所帮助

像上面提到的JayHelps一样,更好的解决方案是使用RXjs AjaxObservable,因为它取消了实际的XMLHttpRequest,而不是忽略响应

但目前RxJS v5“RxJS Observable.ajax跨域问题”中存在一些问题

我找到的好解决方案是“允许绕过默认配置” 如下图所示:

     const fetchUserEpic = action$ =>
              action$.ofType(FETCH_USER)
                .mergeMap(action =>
                  Observable.timer(2000)
                    .mergeMap(() =>
                        Observable.ajax({
                            url:`//api.github.com/users/redux-observable`,
                            crossDomain: true
                        })
                        .do(data => alert(JSON.stringify(data)))
                        .map(fetchUserFulfilled)
                    )
                    .takeUntil(action$.ofType(FETCH_USER_CANCELLED))
                );

哇,太棒了,这已经解释得很清楚了,我所有的疑问现在都被澄清了。。非常感谢你的努力。。我已经测试过了,效果非常好。。再一次,使用AjaxObservable的想法是非常令人惊讶的,我测试过它也会导致一些控制台错误,但肯定会继续下去……我注意到了另一件好事。。取消选项将终止所有(相关)请求,如果用户(意外)多次请求同一呼叫,这将非常有用。。regardsWow,太棒了,这是非常好的解释,我所有的疑问现在都被澄清了。。非常感谢你的努力。。我已经测试过了,效果非常好。。再一次,使用AjaxObservable的想法是非常令人惊讶的,我测试过它也会导致一些控制台错误,但肯定会继续下去……我注意到了另一件好事。。取消选项将终止所有(相关)请求,如果用户(意外)多次请求同一呼叫,这将非常有用。。Regards自5.0.0-beta.10版以来,您链接到的问题已修复并包含在我们的版本中。如果您仍然认为存在bug,您是否可以创建一个新的记录单,并提供一种复制方法?您链接到的问题已修复,并且自5.0.0-beta.10版以来已包含在我们的版本中。如果你仍然相信有一个bug,你能用一种复制的方法创建一个新的票证吗?