From 9627c88545a6cfb6c5237bc244755fba7b342f52 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Sun, 19 Mar 2023 22:56:44 +0200 Subject: [PATCH] doc: update stream.reduce concurrency note --- doc/api/stream.md | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index 6feb891600c953..a04c30fbd10c2a 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2501,21 +2501,44 @@ This method calls `fn` on each chunk of the stream in order, passing it the result from the calculation on the previous element. It returns a promise for the final value of the reduction. -The reducer function iterates the stream element-by-element which means that -there is no `concurrency` parameter or parallelism. To perform a `reduce` -concurrently, it can be chained to the [`readable.map`][] method. - If no `initial` value is supplied the first chunk of the stream is used as the initial value. If the stream is empty, the promise is rejected with a `TypeError` with the `ERR_INVALID_ARGS` code property. ```mjs import { Readable } from 'node:stream'; +import { readdir, stat } from 'node:fs/promises'; +import { join } from 'node:path'; -const ten = await Readable.from([1, 2, 3, 4]).reduce((previous, data) => { - return previous + data; -}); -console.log(ten); // 10 +const directoryPath = './src'; +const filesInDir = await readdir(directoryPath); + +const folderSize = await Readable.from(filesInDir) + .reduce(async (totalSize, file) => { + const { size } = await stat(join(directoryPath, file)); + return totalSize + size; + }, 0); + +console.log(folderSize); +``` + +The reducer function iterates the stream element-by-element which means that +there is no `concurrency` parameter or parallelism. To perform a `reduce` +concurrently, you can extract the async function to [`readable.map`][] method. + +```mjs +import { Readable } from 'node:stream'; +import { readdir, stat } from 'node:fs/promises'; +import { join } from 'node:path'; + +const directoryPath = './src'; +const filesInDir = await readdir(directoryPath); + +const folderSize = await Readable.from(filesInDir) + .map((file) => stat(join(directoryPath, file)), { concurrency: 2 }) + .reduce((totalSize, { size }) => totalSize + size, 0); + +console.log(folderSize); ``` ### Duplex and transform streams