當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Node.js stream.finished(stream[, options], callback)用法及代碼示例


stream.finished(stream[, options], callback)

曆史
版本變化
v15.11.0

添加了signal 選項。

v14.0.0

finished(stream, cb) 將在調用回調之前等待 'close' 事件。該實現嘗試檢測遺留流,並且僅將此行為應用於預計會發出 'close' 的流。

v14.0.0

Readable 流上在'end' 之前發出'close' 將導致ERR_STREAM_PREMATURE_CLOSE 錯誤。

v14.0.0

將在調用 finished(stream, cb) 之前已經完成的流上調用回調。

v10.0.0

添加於:v10.0.0


參數
  • stream <Stream> 可讀和/或可寫流。
  • options <Object>
    • error <boolean> 如果設置為 false ,則對 emit('error', err) 的調用不會被視為已完成。 默認: true
    • readable <boolean> 當設置為 false 時,將在流結束時調用回調,即使流可能仍然可讀。 默認: true
    • writable <boolean> 當設置為 false 時,將在流結束時調用回調,即使流可能仍然是可寫的。 默認: true
    • signal <AbortSignal>允許中止等待流完成。底層流將不是如果信號被中止,則被中止。回調將被調用AbortError.此函數添加的所有已注冊偵聽器也將被刪除。
  • callback <Function> 采用可選錯誤參數的回調函數。
  • 返回: <Function> 清除所有已注冊偵聽器的清理函數。

當流不再可讀、可寫或遇到錯誤或過早關閉事件時獲取通知的函數。

const { finished } = require('node:stream');

const rs = fs.createReadStream('archive.tar');

finished(rs, (err) => {
  if (err) {
    console.error('Stream failed.', err);
  } else {
    console.log('Stream is done reading.');
  }
});

rs.resume(); // Drain the stream.

在流被過早銷毀(如中止的 HTTP 請求)並且不會發出 'end''finish' 的錯誤處理場景中特別有用。

finished API 提供了 Promise 版本:

const { finished } = require('node:stream/promises');

const rs = fs.createReadStream('archive.tar');

async function run() {
  await finished(rs);
  console.log('Stream is done reading.');
}

run().catch(console.error);
rs.resume(); // Drain the stream.

stream.finished() 在調用 callback 後留下懸空事件偵聽器(特別是 'error''end''finish''close' )。這樣做的原因是意外的 'error' 事件(由於不正確的流實現)不會導致意外的崩潰。如果這是不需要的行為,則需要在回調中調用返回的清理函數:

const cleanup = finished(rs, (err) => {
  cleanup();
  // ...
});

相關用法


注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 stream.finished(stream[, options], callback)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。