nodejs를 사용해보신 분들이라면 Writable을 접해 보셨을 것입니다. http 모듈의 요청 콜백 매개변수에 있는 res 매개변수는 쓰기 가능한 객체입니다. 우리는 종종 여기에 여러 가지 내용을 작성하고 마지막으로 end 메소드를 호출합니다. 그렇죠? 이는 모두 Writable의 동작입니다.
우리가 수동으로 생성한 Writable 객체는 사용자에게 제공되므로 사용자가 write 및 end 메소드를 호출합니다. 공급자로서 Writable 객체가 사용자에 의해 수행된 작업이 무엇인지 어떻게 알 수 있습니까? 이 API를 추측해 보세요. 특정 이벤트를 먼저 추측하겠습니다. 하지만 안돼! Readable과 마찬가지로 작업을 수신하기 위해 메서드를 재정의해야 합니다. 다음은 사용자가 컨텐츠를 작성하고 사용자가 작성한 내용을 모니터링할 수 있도록 Writable을 생성하는 예입니다(babel-node 기반).
import stream from 'stream'; var w = new stream.Writable; w._write = (buffer, enc, next) => { console.log(buffer + ''); next(); // 触发「写入完成」 }; w.on('finish', () => { console.log('finish'); }); void function callee(i) { if(i < 10) { w.write(i + '', 'utf-8', () => { // 写入完成 }); } else { w.end(); } setTimeout(callee, 10, i + 1); }(0);
Readable의 _read와 동일합니다. 위의 _write를 덮어쓰지 않으면 예외가 발생합니다.
Error: not implemented at Writable._write (_stream_writable.js:430:6) at doWrite (_stream_writable.js:301:12)
또한 쓰기는 비동기 방식으로 설계되었으며 세 번째 매개변수는 완료 콜백에 전달될 수 있습니다. 소위 완성이란 구현 함수 _write에서 다음 매개변수가 호출되는 것입니다. 쓰기가 비동기적으로 실행되도록 설계된 이유가 있습니다. _write 메서드에서 일부 비동기 트랜잭션을 처리해야 할 때 시퀀스 오류가 발생할 수 있습니다. 예를 들어, 디스크 파일의 쓰기 작업은 비동기식입니다. 파일을 쓸 때 이 비동기 작업을 무시하면 이전 쓰기 작업이 차단되고 완료되지 않은 경우 현재 쓰기 작업이 먼저 실행될 수 있습니다. 따라서 _write에서 합리적으로 next를 호출해야 합니다(호출해야 합니다. 그렇지 않으면 대기 상태에 빠져 계속해서 쓸 수 없습니다).
마지막으로 데이터 쓰기가 완료되면 종료 이벤트가 트리거됩니다. 이는 사용자가 종료 메소드를 호출한다는 의미입니다. 파일 쓰기 작업을 수행하는 경우 이때 파일을 닫아야 합니다.