В отличие от TakeUntil
, вы должны выбрать один из трех случаев, соответствующих OnNext
, OnError
и OnCompleteted
. И уже есть встроенный тип, который фиксирует его в Notification<T>
.
Все, что нам нужно сделать, - это преобразовать конкретные уведомления в неявные - с помощью оператора Dematerialize
.
Вот пример потока, который выдает, если значение 10 встречается в потоке, но завершает его. если любое значение>> 9.
var errorAt10 =
values.Select(value =>
{
if (value == 10)
return Notification.CreateOnError<long>(new Exception());
if (value >= 9)
return Notification.CreateOnCompleted<long>();
return Notification.CreateOnNext(value);
})
.Dematerialize();
Мы могли бы упростить это, если бы хотели:
public static IObservable<T> NotifyAs<T>(this IObservable<T> source, Func<T, NotificationKind> choice, Exception exception = default)
{
return source.Select(value =>
{
switch (choice(value))
{
case NotificationKind.OnError:
return Notification.CreateOnError<T>(exception ?? new Exception());
case NotificationKind.OnCompleted:
return Notification.CreateOnCompleted<T>();
default:
return Notification.CreateOnNext(value);
}
})
.Dematerialize();
}
Теперь вы можете переписать предыдущий пример как:
var errorAt10 =
values.NotifyAs(value =>
value == 10 ? NotificationKind.OnError :
value >= 9 ? NotificationKind.OnCompleted :
NotificationKind.OnNext
);