我知道根据定义,当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并在错误之后订阅新的。
答案 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);
}
}