8

NoFlo.js に触発されてから、highland.js を学んでいます。ストリームを再帰的に操作できるようにしたい。この不自然な例では、2 を掛けた数値を提供し、結果 <= 512 をフィルタリングします。数値が掛けられると、システムにフィードバックされます。私が持っているコードは機能しますが、パイプラインで doto 関数を取り出すと、数字は処理されません。データを returnPipe に間違って送り返していると思われます。データをシステムに戻すより良い方法はありますか? 私は何が欠けていますか?

###
  input>--m--->multiplyBy2>---+
          |                   |
          |                   |
          +---<returnPipe<----+
###

H = require('highland')

input = H([1])
returnPipe = H.pipeline(
  H.doto((v)->console.log(v))
)
H.merge([input,returnPipe])
 .map((v)-> return v * 2)
 .filter((v)-> return v <= 512)
 .pipe(returnPipe)
4

2 に答える 2

1

私の当初の意図は、highland.js で再帰的なファイル リーダーを作成することでした。私は、highland.js github の問題リストに投稿しました。Victor Vu は、素晴らしい記事でこれをまとめるのを手伝ってくれました。

H = require('highland')
fs = require('fs')
fsPath = require('path')

###
  directory >---m----------> dirFilesStream >-------------f----> out
                |                                         |
                |                                         |
                +-------------< returnPipe <--------------+

  legend: (m)erge  (f)ork

 + directory         has the initial file
 + dirListStream     does a directory listing
 + out               prints out the full path of the file
 + directoryFilter   runs stat and filters on directories
 + returnPipe        the only way i can

###

directory = H(['someDirectory'])
mergePoint = H()
dirFilesStream = mergePoint.merge().flatMap((parentPath) ->
  H.wrapCallback(fs.readdir)(parentPath).sequence().map (path) ->
    fsPath.join parentPath, path
)
out = dirFilesStream
# Create the return pipe without using pipe!
returnPipe = dirFilesStream.observe().flatFilter((path) ->
  H.wrapCallback(fs.stat)(path).map (v) ->
    v.isDirectory()
)
# Connect up the merge point now that we have all of our streams.
mergePoint.write directory
mergePoint.write returnPipe
mergePoint.end()
# Release backpressure.
out.each H.log
于 2015-09-10T16:17:29.827 に答える