小编Num*_*ock的帖子

订阅并在第一次操作后立即取消订阅

我想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# extension-methods idisposable system.reactive

6
推荐指数
1
解决办法
1536
查看次数

更容易迭代生成器?

是否有更简单的方法(比我使用的方式)迭代生成器?某种最佳实践模式或常见包装?

在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)

javascript c# generator node.js ecmascript-6

5
推荐指数
1
解决办法
3133
查看次数