簡體   English   中英

如何根據每個元素的條件循環可觀察序列?

[英]How can i loop the observable sequence based on condition from each element?

我有一個序列,我需要根據每個元素的條件重復它。 例如,如果元素標有“失敗”標志,我需要重新處理它。 我的問題是我找不到如何進行while-loop操作。

TakeWhile幾乎是我所需要的,但它不會重演。

/*
* The following lines are just an example to comprehend the idea
*/
var observableSequence = sequence.ToObservable();
observableSequence
    //This ´DoWhile´ did not worked because does not accept each element as argument
    //and sequence at this point is not the same as `observableSequence`
    .DoWhile(() => sequence.Any(item => !item.Failed))
    .Where(item => item.Failed == true) //OK here i could put another condition for limited retries...
    .Subscribe(item => {
        try{
            //Do stuff...
            //. . .
            item.Failed = false;
        } catch
        {
            item.Failed = true;
        }
    });

我建議將原始序列與一個新的observable合並,以便在失敗時將對象輸入。

var retries = new ReplaySubject<Foo>();
var loopSequence = sequence.ToObservable().Merge(retries);

loopSequence
    .Where(item => item.Failed)
    .Subscribe(item =>
    {
        try{
            //Do stuff
            item.Failed = false;
        } catch
        {
            item.Failed = true;
        }
        retries.OnNext(item);
    });

在observables中更改對象狀態通常被認為是不好的做法,因此您可能需要考慮創建轉換:

loopSequence
    .Where(item => item.Failed)
    .Subscribe(item =>
    {
        try{
            //Do stuff
            retries.OnNext(new Item { ..., Failed = false });
        } catch
        {
            retries.OnNext(new Item { ..., Failed = true });
        }
    });

你應該對這種模式非常小心,因為一個連續失敗的項目會使你的程序執行成為一種無限循環。

您可以包裝每個值並獨立重試操作:

observableSequence
  .SelectMany(item => 
    Observable.Return(item)
      .Select(x => //Do Stuff)
      //Optional argument, omitting retries infinitely until
      //success
      .Retry(3)
  )

  .Subscribe(item => {
    //Handle the results
  });

(可選) ReturnIScheduler作為其第二個參數,可以更改重試處理的順序(遞歸與trampoline)。

如何將CSS類添加到

[英]How to add a css class to <i> element based on a condition(value from code behind) using javascript

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM