0

node.js でストリームがますます一般的になってきているので、ストリームについて深く理解しようとしています。JSONStreamevent-streamなどの一般的なモジュールのコードを調べ、 stream-handbookを読みました。

まだわからないことが一つあります。以下のパターンを時々見かけます。

main.js:

var module = require('./module')
module('something').pipe(process.stdout)

モジュール.js:

var Stream = require('stream')

module.exports = function(string) {
  var stream = new Stream()
  stream.readable = true

  stream.resume = function() {
    stream.emit('data', string)
    stream.emit('end')
  }

  process.nextTick(stream.resume)

  return stream
}

pipe内の関数を探すので、これは本当に紛らわしいと思いますmodule.js。この例では、この 1 行process.nextTick()を探して、呼び出された関数を見つける必要があります。初心者の場合process.nextTick()、モジュールが何をするのかを理解していない可能性があります。

このパターンは、ストリーミング モジュールを作成するためのある種の「ベスト プラクティス」ですか? 内にロジックを実装しないのはなぜstream.pipe = function(dest){}ですか?

4

2 に答える 2

3

あなたが提起している問題について完全に明確ではありませんがprocess.nextTick()、これらの場合の の使用は、モジュールのユーザーが、ストリームが作成された後、イベントが発行される前に'data'、などのイベントハンドラーを追加できるようにすることです。あなたの例では必要ありません。クライアントでストリームのイベントハンドラーとして使用されているだけです。入っていないのはそのためです。stream.pipemodule.js

于 2012-10-09T01:58:24.967 に答える
2

これは、サブスクライバー(パイプする書き込み可能なストリーム)がサブスクライブする前に「データ」イベントが発生しないようにするために行われます。このようstream.resumeな「ボールを転がす」ための呼び出しは、データを使用します。ちなみに、彼らはそれをもう少し直感的にするために読み取り可能なストリームビットを分類しています。ここでフォローすることをお勧めします。

process.nextTick編集:ちなみに、toの呼び出しは、ノードのイベントループを通過する次のパスで関数が呼び出されることを意味することを知っておく必要があります。これが、延期された実行(私が同意するのは欺瞞的です)が達成される方法です。

于 2012-10-09T02:10:42.583 に答える