Javascript Rxjs在可观测数据上传递错误后的数据

Javascript Rxjs在可观测数据上传递错误后的数据,javascript,rxjs,reactive-programming,observable,Javascript,Rxjs,Reactive Programming,Observable,我知道,根据定义,当一个可观察对象已完成或有错误时,它会变为冷,您无法向其传递数据。 因此,如果您想在错误之后传递数据,则需要创建一个新的可观察对象。 我只是想知道你是否可以在错误之后恢复可观察的对象,因为我更应该恢复它,而不是创建一个具有相同功能的新对象 例: 新数据3未发送,因为之前有错误。 工作示例: PS:我希望订阅者有错误并在错误发生后发送数据,看起来唯一的方法是创建一个新的可观察对象,并在错误发生后订阅新的可观察对象。不,我的理解是,在可观察错误发生后,您无法向订阅者发送更多数据

我知道,根据定义,当一个可观察对象已完成或有错误时,它会变为,您无法向其传递数据。 因此,如果您想在错误之后传递数据,则需要创建一个新的可观察对象。

我只是想知道你是否可以在错误之后恢复可观察的对象,因为我更应该恢复它,而不是创建一个具有相同功能的新对象

例:

新数据3未发送,因为之前有错误。
工作示例:


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

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

在以下状态下的可观察终止部分:

当被观察者发出未完成或错误通知时,被观察者可释放其资源并终止,其观察者不应试图与其进一步沟通

这向我建议,如果在
错误
之后调用
下一步
,任何订户都不会收到该值,因为他们在收到错误通知后将取消订阅。可观察终止部分也提到了这一点:

当可观测对象向其观察者发出OnError或OnComplete通知时,订阅即告结束


一种策略可以是通过创建一个可观测数据,即错误流,来处理可观测数据中众所周知的错误(即数据验证)

我使用.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);
    }
}
类使用主题
{
公共阶级秩序
{            
私人约会时间;
私有只读主题_paidSubj=新主题();
私有只读主题_errorsubc=新主题();
public IObservable Paid{get{return\u paidSubj.asobbservable();}}
公共IObserble错误{get{return _errorsubc.AsObservable();
}}
公共无效标记已支付(日期时间paidDate)
{
如果(!paidDate.isValid){u errorSubj.OnNext(新错误(“无效paidDate”);返回}
_paidDate=paidDate;
_paidSubj.OnNext(此);//引发付费事件
}
}
私有静态void Main()
{
var order=新订单();
order.Paid.Subscribe(=>Console.WriteLine(“Paid”);//订阅
order.Error.Subscribe(=>Console.WriteLine(“Error”));
order.MarkPaid(DateTime.Now);
}
}

因此,假设您希望http请求有一个重试按钮,当它出现错误时,您希望创建一个新请求。为此,您无法向该可观察对象传递更多数据,您需要创建一个新数据并订阅该数据?重新订阅发出错误的可观察对象。运营商就是这么做的。
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);
    }
}