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