1

私のアプリケーションでは、ネットからデータを取得するために一連の Web 要求呼び出しを使用しています。つまり、1 つの要求の結果から、他の要求を送信します。しかし、Web リクエストを破棄すると、親リクエストのみが破棄されます。他の 2 つの要求はまだ実行中です。Rxでこれらすべてのリクエストをキャンセルするにはどうすればよいですか

4

2 に答える 2

2

サブスクリプションですべてを終了するには、モナドを壊すことができないか、IDisposableモデルに確実に取り組む必要があります。

モナドを保持するには (つまり、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

1 つのアプローチは、こちらで説明されているように、TakeUntil 拡張メソッドを使用することです。あなたの場合、このメソッドをパラメーターとして受け取るイベントは、親リクエストによってスローされたイベントである可能性があります。

コードを見せていただければ、より具体的に問題に対処できます。

よろしく、

于 2012-04-25T07:09:13.053 に答える