Rxjs在Observable上发生错误后传递数据

时间:2016-12-16 10:34:59

标签: javascript rxjs reactive-programming observable

我知道根据定义,当Observable 已完成错误时,它变为,您无法将数据传递给它。 因此,如果您想在错误之后传递数据,则需要创建一个新的Observable。

我只是想知道你是否可以在错误之后以某种方式恢复Observable,因为我更有意义的是恢复它而不是创建一个具有相同功能的新的?

前:

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');

新数据3 未发送,因为它之前有错误 工作示例:https://jsbin.com/sizinovude/edit?js,console

PS:我希望订阅者有错误并在之后发送数据,看起来唯一的方法是创建一个新的Observable并在错误之后订阅新的。

2 个答案:

答案 0 :(得分:1)

不,我的理解是,在发现可观察的错误后,您无法向订阅者发送更多数据。

Observable Contract州的 Observable Termination 部分:

  

当Observable发出OnCompleted或OnError通知时,Observable可以释放其资源并终止,其观察者不应再尝试与之通信。

这告诉我,如果您在next之后致电error,则任何订阅者都不会收到该值,因为他们会在收到错误通知后取消订阅。 Observable Termination 部分也提到了这一点:

  

当Observable向其观察者发出OnError或OnComplete通知时,这将结束订阅。

答案 1 :(得分: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);
    }
}