From 908798ae195bb292c7d124e960964f3d65c230a3 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Fri, 24 Mar 2023 14:27:55 +0300 Subject: [PATCH] doc: update stream.reduce concurrency note PR-URL: https://github.com/nodejs/node/pull/47166 Reviewed-By: Matteo Collina Reviewed-By: Mohammed Keyvanzadeh --- 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 e832ff4cf272d6..8ec678a56a223f 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2499,21 +2499,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