我想IObservable<T>在收到第一个类型元素之后订阅并取消订阅(dipose)订阅T,即我只想在订阅后获得的第一个元素上调用该操作.
这是我提出的方法:
public static class Extensions
{
public static void SubscribeOnce<T>(this IObservable<T> observable, Action<T> action)
{
IDisposable subscription = null;
subscription = observable.Subscribe(t =>
{
action(t);
subscription.Dispose();
});
}
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
public class Program
{
public static void Main()
{
var subject = new Subject<int>();
subject.OnNext(0);
subject.OnNext(1);
subject.SubscribeOnce(i => Console.WriteLine(i));
subject.OnNext(2);
subject.OnNext(3);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,只打印2.这个或其他什么问题有什么不妥吗?是否有一种更清洁的方式使用RX开箱即用的扩展方法?
是否有更简单的方法(比我使用的方式)迭代生成器?某种最佳实践模式或常见包装?
在C#中我通常会有一些简单的东西:
public class Program {
private static IEnumerable<int> numbers(int max) {
int n = 0;
while (n < max) {
yield return n++;
}
}
public static void Main() {
foreach (var n in numbers(10)) {
Console.WriteLine(n);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在JavaScript中尝试相同,这是我能想到的最好的:
function* numbers(max) {
var n = 0;
while (n < max) {
yield n++;
}
}
var n;
var numbers = numbers(10);
while (!(n = numbers.next()).done) {
console.log(n.value);
}
Run Code Online (Sandbox Code Playgroud)
虽然我会期待一些简单的事情......
function* numbers(max) {
let n = 0;
while …Run Code Online (Sandbox Code Playgroud)