ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js_node.jsのWritableオブジェクトを説明する例
nodejs を使ったことがある限り、Writable に触れたことがあるはずです。 http モジュールのリクエスト コールバック パラメータの res パラメータは、Writable オブジェクトです。多くの場合、それに大量の内容を書き込んで、最後に 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 は非同期メソッドとして設計されており、その 3 番目のパラメーターを完了コールバックで渡すことができます。いわゆる完了とは、実装関数 _write で次のパラメーターが呼び出されるということです。 write が非同期になるように設計されているのには理由があります。同期的に実行すると、_write メソッドで非同期トランザクションを処理する必要があるときにシーケンス エラーが発生する可能性があります。たとえば、ディスク ファイルの書き込み操作が非同期である場合、ファイルの書き込み時にこの非同期操作を無視すると、前の書き込み操作がブロックされて完了していない場合、現在の書き込み操作が最初に実行される可能性があります。したがって、合理的には _write で next を呼び出す必要があります (必ず呼び出す必要があります。そうしないと待機状態になり、書き込みを続行できなくなります)。
最後に、データの書き込みが完了すると、終了イベントがトリガーされます。これは、ユーザーによって終了メソッドが呼び出されることを意味します。ファイルの書き込み操作を実行している場合は、この時点でファイルを閉じる必要があります。