[英]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.