我正在尝试从文件中读取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") }
);
}