我试图编写一个可写流,它可以获取对象流并将它们输入到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);
程序退出时没有"建立连接!"永远写在控制台上。
我错过了什么?我应该遵循某种习语吗?
答案 0 :(得分:0)
通过阅读源代码和一些一般实验,我想出了如何做一个异步的事情然后继续处理流。基本上,您使用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.
// => .-------------------
基本上是'。' async函数完成时输出,而流的每个对象都输出' - '。
希望这能节省一些时间。令我尴尬地渴望得出这个。 ^^