[英]Do something before consuming stream, using 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);
该程序只是在没有“建立连接”的情况下退出。 曾经被写入控制台。
我想念什么? 我应该遵循某种成语吗?
通过阅读源代码和一些常规实验,我了解了如何执行单个异步操作,然后继续在流中进行处理。 基本上,您可以使用flatMap将异步任务中的事件替换为实际要处理的流。
我没想到的另一个怪癖是使_.pipeline
不起作用,除非原始流在回调中被完全使用。 这就是为什么仅将_.map和日志内容(这就是我尝试对其进行调试的方式)放入后就无法正常工作的原因。 取而代之的是,需要确保each
或最后done
。 下面是一个最小的示例:
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.
// => .-------------------
基本上是一个“。” 完成异步功能后,将输出,对于流的每个对象均输出“-”。
希望这可以节省一些时间。 我尴尬地花了很长时间才弄清楚这一点。 ^^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.