使用highland.js

时间:2016-03-08 13:06:58

标签: javascript ecmascript-6 reactive-programming highland.js

我试图编写一个可写流,它可以获取对象流并将它们输入到mongodb数据库中。在使用对象流之前,我首先需要等待db-connection建立,但我似乎做错了,因为程序永远不会到达插入部分。

// ./mongowriter.js

let mongo = mongodb.MongoClient,
    connectToDb = _.wrapCallback(mongo.connect);

export default url => _.pipeline(s => {
  return connectToDb(url).flatMap(db => {
    console.log('Connection established!');
    return s.flatMap(x => /* insert x into db */);
  });
});

....

// Usage in other file
import mongowriter from './mongowriter.js';

let objStream = _([/* json objects */]);

objStream.pipe(mongoWriter);

程序退出时没有"建立连接!"永远写在控制台上。

我错过了什么?我应该遵循某种习语吗?

1 个答案:

答案 0 :(得分:0)

通过阅读源代码和一些一般实验,我想出了如何做一个异步的事情然后继续处理流。基本上,您使用flatMap将异步任务中的事件替换为您实际要处理的流。

我没想到的另一个怪癖是什么让我失望,_.pipeline除非原始流在回调中被完全消耗,否则将无效。这就是为什么它不能简单地放入_.map和日志(这是我试图调试它的方式)。相反,我们需要确保最后有eachdone。以下是一个最小的例子:

export default _ => _.pipeline( stream => {
  return _(promiseReturningFunction())
    .tap(_ => process.stdout.write('.'))
    .flatMap(_ => stream)
    .each(_ => process.stdout.write('-'));
});

// Will produce something like the following when called with a non-empty stream.
// Note the lone '.' in the beginning.
// => .-------------------

基本上是'。' async函数完成时输出,而流的每个对象都输出' - '。

希望这能节省一些时间。令我尴尬地渴望得出这个。 ^^

相关问题