diff options
author | Matteo Collina <hello@matteocollina.com> | 2018-11-27 09:24:48 +0100 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2018-11-29 17:13:29 +0100 |
commit | fa1535aed7f8dcfe0400f6359c068253032f5973 (patch) | |
tree | 7d64abd55b757adf2ce90ad20b2f7d731ef32a06 /lib | |
parent | 9e33e86180b7c1035d13bd201bdeffff0b7e70fd (diff) | |
download | android-node-v8-fa1535aed7f8dcfe0400f6359c068253032f5973.tar.gz android-node-v8-fa1535aed7f8dcfe0400f6359c068253032f5973.tar.bz2 android-node-v8-fa1535aed7f8dcfe0400f6359c068253032f5973.zip |
stream: make async iterator .next() always resolve
See: https://github.com/nodejs/readable-stream/issues/387
PR-URL: https://github.com/nodejs/node/pull/24668
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/internal/streams/async_iterator.js | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/internal/streams/async_iterator.js b/lib/internal/streams/async_iterator.js index 7eaef69508..cc8e218498 100644 --- a/lib/internal/streams/async_iterator.js +++ b/lib/internal/streams/async_iterator.js @@ -39,6 +39,11 @@ function onReadable(iter) { function wrapForNext(lastPromise, iter) { return (resolve, reject) => { lastPromise.then(() => { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + iter[kHandlePromise](resolve, reject); }, reject); }; @@ -61,7 +66,7 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ } if (this[kEnded]) { - return Promise.resolve(createIterResult(null, true)); + return Promise.resolve(createIterResult(undefined, true)); } if (this[kStream].destroyed) { @@ -74,7 +79,7 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ if (this[kError]) { reject(this[kError]); } else { - resolve(createIterResult(null, true)); + resolve(createIterResult(undefined, true)); } }); }); @@ -115,7 +120,7 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ reject(err); return; } - resolve(createIterResult(null, true)); + resolve(createIterResult(undefined, true)); }); }); }, @@ -131,7 +136,6 @@ const createReadableStreamAsyncIterator = (stream) => { value: stream._readableState.endEmitted, writable: true }, - [kLastPromise]: { value: null, writable: true }, // the function passed to new Promise // is cached so we avoid allocating a new // closure at every run @@ -151,6 +155,7 @@ const createReadableStreamAsyncIterator = (stream) => { writable: true, }, }); + iterator[kLastPromise] = null; finished(stream, (err) => { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { @@ -172,7 +177,7 @@ const createReadableStreamAsyncIterator = (stream) => { iterator[kLastPromise] = null; iterator[kLastResolve] = null; iterator[kLastReject] = null; - resolve(createIterResult(null, true)); + resolve(createIterResult(undefined, true)); } iterator[kEnded] = true; }); |