rxjs订阅调用一个返回promise的函数,需要Promise.each样式调度

时间:2016-01-26 09:51:42

标签: javascript node.js promise bluebird rxjs

我正在尝试从文件中读取JSON,过滤掉我不想要的东西,并可能映射和展平JSON元素,然后为文件中的每个过滤的JSON行调用一个返回promise的函数。 (基本上是来自bunyan生产的文件的尾巴-f)。 附加要求:我希望调步基于函数解析承诺的速度(输出调步,一次一个元素,如Promise.each)

对于RXJS和承诺来说,这听起来很有用,对吗?好吧,除了所有的例子都是承诺生成可观察流,而不是那些订阅者调用返回承诺的函数的流。

RXJS的可用调度程序似乎没有基于输出的单一并发调步,相当于Promise.each(我试过flatMapWithMaxConcurrent)

在此代码中,update返回一个promise。一旦我修复了库错误,承诺就解决了,但控制台输出乱序,并且承诺以高度并发的方式解决。承诺实际上需要5秒才能解决,我希望每隔5秒就会看到一个控制台消息。相反,有一个5秒的延迟和一堆消息,这意味着我认为许多消息是同时运行的。

我创建的库有Bluebird的承诺,我不能在不删除所有代码的承诺的情况下重写它。有点受到诱惑,这是我第二次追捕未解决的承诺。我知道怎么用“C”写这个......

function tailMyFile(filename, ocu, oce) {
    var handle = new Tail(filename);

    handle.bunyan().filter(function (x) {
        if ("descr" in x &&  "units" in x && "value" in x && "time" in x)  {
            return true;
        }
    })
    .subscribe (
        function(x) {
            if (x.descr == "enter") {
                MyPromisifiedLib.update(oce, x.value, "").done(function() {
                    console.log("updated enter value");
                })
            } else if ("push" in x) {
                MyPromisifiedLib.update(ocu, x.value, "push").done(function() {
                    console.log("updated with push");
                })
            } else {
                MyPromisifiedLib.update(ocu, x.value, "").done(function() {
                    console.log("updated value");
                })
            }
        },
        function(err) {
            console.error("err leaked through to subscriber");
            log.error("err leaked through to subscriber");
        },
        function() { log.info("Completed") }
    );
}   

0 个答案:

没有答案