2016-10-11 18 views
1

私には2つのものがあります:Task<TResult> queryIObservable<bool> toggleを返す関数です。私が作成したいのはIObservable<TResult>です。toggletrueになると、毎回queryが呼び出され、結果が返される無限ループが開始されます。次に、トグルがfalseになると、無限ループが停止するはずです。タスク関数から観測可能な無限IObservableであり、観測可能に切り替えます

タスクから無限ループを作成する方法を読んだが、toggleをオンとオフにする方法を理解できない。また、無限ループ内でqueryを実行することはできず、フィルタリングするだけです。 togglefalseの場合、クエリを呼び出すべきではありません。また、toggleが偽になった場合には大丈夫です。queryがすでに開始されている場合、結果として得られる観測可能物は返されません。 toggleがfalseの場合はqueryをキャンセルすることをお勧めしますが、必須ではありません。

私は自動的にテスト可能にしたいと思います。

私は正確に何をしたいんだと思う

答えて

2

IObservable<TResult> query = 
    toggle 
     .Select(b => b 
      ? Observable 
       .Defer(() => Observable.FromAsync(() => SomeFunction())) 
       .Repeat() 
      : Observable 
       .Never<TResult>()) 
     .Switch(); 
+0

おかげで、これは期待通りに動作するようです。 – Euphoric

+0

こんにちは、ごめんなさい、私のフォローアップの質問を見てもらえますか?http://stackoverflow.com/questions/39993609/infinite-iobservable-from-task-function-and-toggle-observable-with-parameters – Euphoric

+0

私はこの関数のテストを書こうとしています。私は 'Observable.FromAsync(()=> SomeFunction())'を 'Func > query(これは唯一の項目を返すコールドオブザーバブル)に置き換えたので、' TestScheduler'を使ってこの関数をテストすることができます。しかし、私は 'scheduler.Start'メソッドが何のメッセージも返さないという問題を抱えています。この方法が自動的にテストできることを確認できますか? – Euphoric

関連する問題