2014-03-31 2 views
2

Node.js에는 데이터를 소비하는 다른 옵션이 있습니다. 스트림 0,1,2,3 등 ...읽기 (당기기) vs 파이프 (제어 흐름) vs 데이터 (푸시)

제 질문은 의 실제 적용과 관련되어 있습니다. 이러한 다른 옵션. 나는 상당히 이해한다 읽기/읽기, 데이터 이벤트와 의 차이 파이프를 선택했지만 구체적으로 선택하는 것에 대해 자신감이 없다. 방법.

예를 들어 흐름 제어를 사용하려는 경우 과 함께 읽으십시오. 파이프는 물론 일부 수동 작업도 사용할 수 있습니다. 데이터 이벤트가 흐름 제어를 무시합니다. 사용을 중지해야합니까? 일반 데이터 이벤트?

+1

아마도 https://www.youtube.com/watch?v=QgEuZ52OZtU가 도움이됩니다. :-) –

+1

Golo Roden에게 고맙습니다. 나는 "시간이 지남에 따라 배열"을 좋아했습니다 :) –

답변

5

대부분의 일을 위해, 당신은, 당신이 all the work I do with streams를 들어 당신

에 대한 모든 설정 그냥 아주 편리한 래퍼 것을 볼 수 있습니다, 당신은 the source code for the Stream.prototype.pipe implementation 보면

src.pipe(dest); 

을 사용할 수 있어야합니다 일반적으로 적절한 스트림 유형 (Readable, Writable, Duplex, Transform 또는 PassThrough)을 선택한 다음 적절한 방법 (_read, _write 및/또는)을 정의합니다.). 마지막으로 .pipe을 사용하여 모든 것을 연결합니다.

그것은 여기 내 burro 모듈에 사용하고 스트림의, 예를 들어

client.pipe(encoder).pipe(server).pipe(decoder).pipe(client) 

"원형"으로 표시 스트림 설정을 보는 것은 매우 일반적입니다. 개체를이 스트림에 쓸 수 있으며 JSON 문자열을 읽을 수 있습니다.

// https://github.com/naomik/burro/blob/master/lib/encoder.js 
var stream = require("stream"), 
    util = require("util"); 

var Encoder = module.exports = function Encoder() { 
    stream.Transform.call(this, {objectMode: true}); 
}; 

util.inherits(Encoder, stream.Transform); 

Encoder.prototype._transform = function _transform(obj, encoding, callback) { 
    this.push(JSON.stringify(obj)); 
    callback(null); 
}; 

일반적인 권장 사항으로, 거의 항상 이처럼 스트림을 작성합니다. 즉, 내장 된 스트림 중 하나에서 상속받은 자신 만의 "클래스"를 작성합니다. 내장 스트림을 직접 사용하는 것은 실제적이지 않습니다.


당신이 이것을 사용

var encoder = new Encoder(); 

가 배관에 의해 인코더 출력

encoder.pipe(process.stdout); 

일부를 쓰기 stdout에 무엇을 참조하십시오 스트림의 새로운 인스턴스를 생성하여 시작하는 방법을 보여주기 위해 샘플 객체

encoder.write({foo: "bar", a: "b"}); 
// '{"foo":"bar","a":"b"}' 

encoder.write({hello: "world"}); 
// '{"hello":"world"}' 
+0

감사합니다 naomik. 내 질문은 주로 사용자 정의 스트림이 아닌 스트림으로 작성되었습니다. –

+0

@PK, 정확히 그 말을 기쁘게 생각합니다. 내장 된 스트림 객체를 직접 사용하지 않아도됩니다. 당신은 그것들을 "서브 클래스화"하기위한 것입니다. 내 업데이트 된 게시물을 참조하십시오. – naomik