diff --git a/.changeset/healthy-hornets-warn.md b/.changeset/healthy-hornets-warn.md new file mode 100644 index 00000000..066d4fcb --- /dev/null +++ b/.changeset/healthy-hornets-warn.md @@ -0,0 +1,5 @@ +--- +'@urql/exchange-execute': patch +--- + +End iterator when teardown functions runs, previously it waited for one extra call to next, then ended the iterator diff --git a/exchanges/execute/src/execute.ts b/exchanges/execute/src/execute.ts index 2501a264..cb5c5bed 100644 --- a/exchanges/execute/src/execute.ts +++ b/exchanges/execute/src/execute.ts @@ -49,6 +49,7 @@ const makeExecuteSource = ( args: ExecuteParams ): Source => { return make(observer => { + let iterator: AsyncIterator; let ended = false; Promise.resolve() @@ -66,10 +67,7 @@ const makeExecuteSource = ( observer.next(makeResult(operation, result as ExecutionResult)); return; } - - const iterator: AsyncIterator = result[ - asyncIterator! - ](); + iterator = result[asyncIterator!](); let prevResult: OperationResult | null = null; function next({ @@ -90,9 +88,6 @@ const makeExecuteSource = ( if (!done && !ended) { return iterator.next().then(next); } - if (ended) { - iterator.return && iterator.return(); - } } return iterator.next().then(next); @@ -106,6 +101,7 @@ const makeExecuteSource = ( }); return () => { + if (iterator && iterator.return) iterator.return(); ended = true; }; });