2016-12-16 69 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); 
    } 
}