2016-12-16 64 views
2

我知道通過定義時可觀察到的是完成或者它有一個錯誤成爲,你不能傳遞數據給它。 因此,如果您想在錯誤之後傳遞數據,則需要創建一個新的Observable。

我只是想知道,如果你以某種方式可以錯誤後恢復觀察的,因爲它使更多的意義對我來說,這不是恢復到創建一個新的具有相同的功能?Rxjs錯誤後,通過數據可觀察

例:

const subject = new Rx.Subject(); 

subject.subscribe(
    data => console.log(data), 
    error => console.log('error') 
); 

subject.next('new data'); 
subject.next('new data2'); 

subject.error('error'); 

subject.next('new data3'); 

新DATA3不會發送,因爲在此之前有一個錯誤。
工作例如:https://jsbin.com/sizinovude/edit?js,console

PS:我想用戶有錯誤,也後發送數據,看起來像是唯一的方法是創建一個新的觀察到的,訂閱錯誤後的新一個。

回答

1

不,我的理解是,您不能在可觀察到的錯誤後向訂閱者發送更多數據。

可觀察終止節中的Observable Contract狀態:

當可觀察到的不發出OnCompleted或的OnError通知,可觀察可以釋放其資源和終止,及其觀察員不應試圖與溝通它更進一步。

這表明,我認爲,如果你error後打電話next,任何用戶將無法收到的價值,因爲他們將在收到錯誤通知的退訂。這也是在可觀察終止部分中提到:

當可觀察到的問題進行的OnError或通知的onComplete其觀察員,這結束認購。

+0

因此,可以說,你想要一個http請求重試按鈕,當它要創建一個新的請求的錯誤。爲此,您無法將更多數據傳遞給該Observable,您需要創建一個新的數據並訂閱該數據? – tibbus

+0

重新訂閱發出錯誤的觀察值。這就是[retry](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-retry)運算符所做的事情。 – cartant

0

一種策略可能是通過創建一個可觀察到的錯誤流來處理可觀察對象中的已知錯誤(即數據驗證)。

我使用.NET,但我相信你的想法:

class UseSubject 
{ 
    public class Order 
    {    
     private DateTime? _paidDate; 

     private readonly Subject<Order> _paidSubj = new Subject<Order>(); 
     private readonly Subject<Error> _errorSubj = new Subject<Error>(); 
     public IObservable<Order> Paid { get { return _paidSubj.AsObservable(); } } 
     public IObserble<Error> Error {get {return _errorSubj.AsObservable(); 
}} 
     public void MarkPaid(DateTime paidDate) 
     { 
      if (!paidDate.isValid){_errorSubj.OnNext(New Error("invalid paidDate")); return} 
      _paidDate = paidDate;     
      _paidSubj.OnNext(this); // Raise PAID event 
     } 
    } 

    private static void Main() 
    { 
     var order = new Order(); 
     order.Paid.Subscribe(_ => Console.WriteLine("Paid")); // Subscribe 
     order.Error.Subscribe(_ => Console.WriteLine("Error")); 
     order.MarkPaid(DateTime.Now); 
    } 
}