From 71c1198d12b5028147f69e6117f592e28afbaf36 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 1 May 2018 18:01:25 +0100 Subject: [PATCH] Rewrite limitConcurrency to fix error catching Make sure that we only catch errors that are a result of calling fn() --- src/stores/GroupStore.js | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/stores/GroupStore.js b/src/stores/GroupStore.js index f4a66f432f..0e2e8e6b86 100644 --- a/src/stores/GroupStore.js +++ b/src/stores/GroupStore.js @@ -48,30 +48,30 @@ function checkBacklog() { // Limit the maximum number of ongoing promises returned by fn to LIMIT and // use a FIFO queue to handle the backlog. -function limitConcurrency(fn) { - return new Promise((resolve, reject) => { - const item = () => { - ongoingRequestCount++; - resolve(); - }; - if (ongoingRequestCount >= LIMIT) { - // Enqueue this request for later execution - backlogQueue.push(item); - } else { - item(); - } - }) - .then(fn) - .catch((err) => { +async function limitConcurrency(fn) { + if (ongoingRequestCount >= LIMIT) { + // Enqueue this request for later execution + await new Promise((resolve, reject) => { + backlogQueue.push(resolve); + }); + } + + let result; + let error; + + ongoingRequestCount++; + try { + result = await fn(); + } catch (err) { + error = err; + } finally { ongoingRequestCount--; checkBacklog(); - throw err; - }) - .then((result) => { - ongoingRequestCount--; - checkBacklog(); - return result; - }); + } + + if (error) throw error; + + return result; } /**