readable.find(fn[, options])


稳定性: 1 - 实验性

  • fn <Function> | <AsyncFunction> 是一个在流的每个数据块上调用的函数。
    • data <any> 从流中获取一块数据。
    • options <Object>
      • signal <AbortSignal> 如果流被销毁则中止,从而允许提前中止 fn 调用。
  • options <Object>
    • concurrency <number>fn 在流上同时调用的最大并发次数。默认值: 1
    • signal <AbortSignal> 允许在信号被中止时销毁流。
  • 返回:<Promise> 一个 promise,该 promise 会返回第一个经过 fn 评估为真值的块,如果未找到任何元素,则返回 undefined

此方法类似于 Array.prototype.find,会在流中的每个块上调用 fn,以查找 fn 返回真值的块。一旦某次 fn 调用的 await 返回值为真,流将被销毁,并且该 promise 会以 fn 返回真值的那个值被解决。如果所有块上的 fn 调用都返回假值,则该 promise 会以 undefined 被解决。

【This method is similar to Array.prototype.find and calls fn on each chunk in the stream to find a chunk with a truthy value for fn. Once an fn call's awaited return value is truthy, the stream is destroyed and the promise is fulfilled with value for which fn returned a truthy value. If all of the fn calls on the chunks return a falsy value, the promise is fulfilled with undefined.】

import { Readable } from 'node:stream';
import { stat } from 'node:fs/promises';

// With a synchronous predicate.
await Readable.from([1, 2, 3, 4]).find((x) => x > 2); // 3
await Readable.from([1, 2, 3, 4]).find((x) => x > 0); // 1
await Readable.from([1, 2, 3, 4]).find((x) => x > 10); // undefined

// With an asynchronous predicate, making at most 2 file checks at a time.
const foundBigFile = await Readable.from([
  'file1',
  'file2',
  'file3',
]).find(async (fileName) => {
  const stats = await stat(fileName);
  return stats.size > 1024 * 1024;
}, { concurrency: 2 });
console.log(foundBigFile); // File name of large file, if any file in the list is bigger than 1MB
console.log('done'); // Stream has finished