1

在我的应用程序中,我使用网络请求调用链从网络获取数据。即根据一个请求的结果,我将发送其他请求,依此类推。但是当我处理 Web 请求时,只有父请求正在处理。另外两个请求仍在运行。我如何在 Rx 中取消所有这些请求

4

2 回答 2

2

为了使您的订阅终止所有内容,您要么不能破坏 monad,要么需要确保您在IDisposable模型中工作。

要保留 monad(即坚持使用 IObservables):

var subscription = initialRequest.GetObservableResponse()
    .SelectMany(initialResponse =>
    {
        // Feel free to use ForkJoin or Zip (intead of Merge) to 
        // end up with a single value
        return secondRequest.GetObservableResponse()
            .Merge(thirdRequest.GetObservableResponse());
    })
    .Subscribe(subsequentResponses => { });

要使用IDisposable模型:

var subscription = initialRequest.GetObservableResponse()
    .SelectMany(initialResponse =>
    {
        return Observable.CreateWithDisposable(observer =>
        {
            var secondSubscription = new SerialDisposable();
            var thirdSubscription = new SerialDisposable();

            secondSubscription.Disposable = secondRequest.GetObservableResponse()
                .Subscribe(secondResponse =>
                {
                    // Be careful of race conditions here!

                    observer.OnNext(value);
                    observer.OnComplete();
                });

            thirdSubscription.Disposable = thirdRequest.GetObservableResponse()
                .Subscribe(thirdResponse =>
                {
                    // Be careful of race conditions here!
                });

            return new CompositeDisposable(secondSubscription, thirdSubscription);
        });
    })
    .Subscribe(subsequentResponses => { });
于 2012-04-26T03:38:08.860 回答
1

一种方法是使用 TakeUntil extnsion 方法,如此处所述。在您的情况下,将此方法作为参数的事件可能是父请求引发的某个事件。

如果您可以向我们展示一些代码,我们可以更具体地解决问题。

问候,

于 2012-04-25T07:09:13.053 回答