我想使用RxJS来“桥接”事件的异步世界和同步世界。
具体来说,我想创建一个函数,该函数返回在某个时间间隔内收集的事件数组。

我可以创建我想要的Observable

    var source = Rx.Observable
    .interval(100 /* ms */)
    .bufferWithTime(1000).take(1)

我可以打印正确的值

    var subscription = source.subscribe(
        function (x) {
            console.log('Next: ' + JSON.stringify(x));
        },
        function () {
            console.log('Completed');
        });

此打印
    [0,1,2,3,4,5,6,7,8]
    Completed

但是我想要的是将这个数组分配给变量。从概念上讲,我想要类似
var collectedDuringSecond = source.toPromise.getValue()
这个想法是getValue将阻塞,因此在完成上述行的收集之后,DuringSecond将包含[0,1,2,3,4,5,6,7,8]

最佳答案

JavaScript中的同步事件编程具有严格的限制。实际上,在很多情况下这是不可能的。我尝试破解Rx,看看是否可以在不修改Rx源的情况下提供同步接口(interface),并且(出于充分的理由)使用直接的JavaScript是不可能的。

我建议将Observable公开为您的API的一部分,并允许消费者从那里进行处理(当然要轻推使用Rx;)。

function MyClass () {

    this.getArrayOfStuffAsObservable = function () {
        return Rx.Observable.interval(100)
            .bufferWithTime(1000).take(1);
    };

    // this is optional and I don't recommend it, since you already have Rx available.
    // additionally, consumers will probably miss the fact that you can dispose
    // of the subscription.
    this.getArrayOfStuff = function (callback) {
        var value;
        return this.getArrayOfStuffAsObservable()
            .subscribe(
                function (x) {
                    value = x;
                },
                function (err) {
                    callback(err);
                },
                function () {
                    if (hasValue) {
                        callback(undefined, value);
                    } else {
                        callback('did not receive value');
                    }
                });

    };
};

作为附加说明,对于此特定示例,您可能希望将toArraytake结合使用,而不是bufferWithTime(这实际上是完成相同事情的两种方法,但一种是基于时间,另一种是基于项目计数)。 toArray创建一个Observable,它将收集基础Observable的所有值,并在基础Observable完成时将这些值作为数组产生。
this.getArrayOfStuffAsObservable = function () {
    return Rx.Observable.interval(100)
        .take(10)
        .toArray();
};

关于reactive-extensions-js - 收集可观察到的RxJS数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23231909/

10-13 02:39