当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js stream.Writable.write(chunk[, encoding][, callback])用法及代码示例


writable.write(chunk[, encoding][, callback])

历史
版本变化
v8.0.0

chunk 参数现在可以是 Uint8Array 实例。

v6.0.0

null 作为 chunk 参数传递现在将始终被视为无效,即使在对象模式下也是如此。

v0.9.4

添加于:v0.9.4


参数
  • chunk <string> | <Buffer> | <Uint8Array> | <any> 可选数据写入。对于不在对象模式下运行的流,chunk 必须是字符串,BufferUint8Array。对于对象模式流,chunk 可以是除 null 之外的任何 JavaScript 值。
  • encoding <string> | <null> 编码,如果 chunk 是字符串。 默认: 'utf8'
  • callback <Function> 刷新此数据块时的回调。
  • 返回: <boolean> false 如果流希望调用代码在继续写入其他数据之前等待发出 'drain' 事件;否则 true

writable.write() 方法将一些数据写入流,并在数据完全处理后调用提供的callback。如果发生错误,将调用 callback,并将错误作为其第一个参数。 callback'error' 发出之前被异步调用。

如果内部缓冲区小于在承认 chunk 后创建流时配置的 highWaterMark,则返回值为 true。如果返回 false,则应停止进一步尝试将数据写入流,直到发出 'drain' 事件。

当流没有耗尽时,对 write() 的调用将缓冲 chunk 并返回 false。一旦所有当前缓冲的块被耗尽(操作系统接受交付),将发出 'drain' 事件。一旦 write() 返回 false,在发出 'drain' 事件之前不要写入更多块。在允许在未耗尽的流上调用 write() 时,Node.js 将缓冲所有写入的块,直到达到最大内存使用量,此时它将无条件中止。甚至在它中止之前,高内存使用会导致垃圾Collector性能差和 RSS 高(通常不会将其释放回系统,即使在不再需要内存之后也是如此)。由于如果远程对等方不读取数据,TCP 套接字可能永远不会耗尽,因此写入不耗尽的套接字可能会导致远程可利用的漏洞。

在流未耗尽时写入数据对于 Transform 尤其成问题,因为默认情况下 Transform 流会暂停,直到它们通过管道传输或添加 'data''readable' 事件处理程序。

如果要写入的数据可以按需生成或获取,建议将逻辑封装成 Readable 并使用 stream.pipe() 。但是,如果首选调用 write(),则可以使用 'drain' 事件来尊重背压并避免内存问题:

function write(data, cb) {
  if (!stream.write(data)) {
    stream.once('drain', cb);
  } else {
    process.nextTick(cb);
  }
}

// Wait for cb to be called before doing any other write.
write('hello', () => {
  console.log('Write completed, do more writes now.');
});

对象模式下的 Writable 流将始终忽略 encoding 参数。

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 stream.Writable.write(chunk[, encoding][, callback])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。