From 821b9ac00700966c6502aaad7c982e2e55d170d9 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Wed, 15 Jan 2020 10:29:06 +0100 Subject: [PATCH] doc: further fix async iterator example Further fixes an issue with the async iterator example where an incorrect assumption was made in regards that drain or error is always invoked after !write(). Fixes: https://github.com/nodejs/node/issues/31365 PR-URL: https://github.com/nodejs/node/pull/31367 Reviewed-By: Matteo Collina Reviewed-By: Luigi Pinca --- doc/api/stream.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/api/stream.md b/doc/api/stream.md index e63fa4fd6a92ec..840c8ce4ca3bf4 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2639,12 +2639,22 @@ const finished = util.promisify(stream.finished); const writable = fs.createWriteStream('./file'); +function drain(writable) { + if (writable.destroyed) { + return Promise.reject(new Error('premature close')); + } + return Promise.race([ + once(writable, 'drain'), + once(writable, 'close') + .then(() => Promise.reject(new Error('premature close'))) + ]); +} + async function pump(iterable, writable) { for await (const chunk of iterable) { // Handle backpressure on write(). if (!writable.write(chunk)) { - if (writable.destroyed) return; - await once(writable, 'drain'); + await drain(writable); } } writable.end();