From f06d1c75acd9e62c96829c105212854b507a93a9 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Wed, 4 Dec 2019 12:45:14 -0500 Subject: [PATCH] fix(cursor): wait until all `eachAsync()` functions finish before resolving the promise Fix #8352 --- lib/helpers/cursor/eachAsync.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/helpers/cursor/eachAsync.js b/lib/helpers/cursor/eachAsync.js index 95a38dbf93a..029f203c9eb 100644 --- a/lib/helpers/cursor/eachAsync.js +++ b/lib/helpers/cursor/eachAsync.js @@ -35,8 +35,9 @@ module.exports = function eachAsync(next, fn, options, callback) { } }; - const iterate = function(callback) { + const iterate = function(finalCallback) { let drained = false; + let handleResultsInProgress = 0; let error = null; for (let i = 0; i < parallel; ++i) { @@ -49,26 +50,33 @@ module.exports = function eachAsync(next, fn, options, callback) { } next(function(err, doc) { - if (drained || error) { + if (drained || error != null) { return done(); } if (err != null) { error = err; - callback(err); + finalCallback(err); return done(); } if (doc == null) { drained = true; - callback(null); + if (handleResultsInProgress <= 0) { + finalCallback(null); + } return done(); } done(); + ++handleResultsInProgress; handleNextResult(doc, function(err) { + --handleResultsInProgress; if (err != null) { error = err; - return callback(err); + return finalCallback(err); + } + if (drained && handleResultsInProgress <= 0) { + return finalCallback(null); } setTimeout(() => enqueue(fetch), 0);