簡體   English   中英

使用highland.js在消費流之前做點什么

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM