@repeaterjs/repeater
Advanced tools
Changelog
repeater@3.0.6 - 2024-05-08
push
function not resolving when using a buffer.Changelog
repeater@3.0.5 - 2023-11-07
nodenext
Changelog
repeater@3.0.4 - 2020-09-02
Changelog
repeater@3.0.2 - 2020-08-03
Changelog
repeater@3.0.0 2019-11-10
This release overhauls the push
and stop
promises and the return
and throw
methods to be more in line with the behavior of async generators. If you used repeaters to simply add and remove event handlers, you can upgrade without worrying about breaking changes. However, if you awaited push
calls, read the value of the stop
promise, or used the return
or throw
methods in non-trivial ways, this release may break your code.
Previously, the n-th call to push
resolved to the value passed to the n-th call to Repeater.prototype.next
. This was inaccurate insofar as async generators resume the n-th yield
with the value passed to the n+1-th call to next
. Additionally, async generators completely ignore the first value passed to next
entirely. The former behavior of repeaters was confusing insofar as the first call to push
would always resolve immediately, because push
could not be called until next
was called for the first time. In 3.0, the behavior has now been changed so that the n-th call to push
resolves to the n+1-th call to next
.
For the most part, code which awaits push
will work as expected, except when the code relied on the first call to push
resolving immediately. To make sure you’re not relying on the old behavior of push
, you should make sure that you await push at the bottom of loops, rather than the top. See the changes to timers
as an example.
Calling Repeater.prototype.throw
will now cause the previous push
call to reject, rather than simply stopping the repeater and throwing the error. This means errors thrown into repeaters are now recoverable. If you call push without awaiting or calling then/catch
on the returned promise and then call the throw
method, the repeater will rethrow the error, preserving the previous behavior. However, if you await push
or otherwise call the then
or catch
methods, it becomes your responsibility to handle errors thrown in via throw
and stop the repeater. #43
The stop
promise no longer resolves to the value passed to Repeater.prototype.return
. Instead, it consistently fulfills to undefined
when the repeater is stopped. Additionally, calling Repeater.prototype.return
will return a result whose value is always whatever was passed to return
. In the case of premature returns, the return value of the executor is ignored unless it throws an error. #41
This change was made because there is no way with async generators to inspect the value passed to return from within the async generator. Additionally, the only way to modify the result returned from the return
method would be to put a return
statement in a finally
block within the async generator, which is typically considered to be a bad practice. Repeaters now uniformly return the value passed to the return
method. See #40 for a longer explanation for why we made this change.
Errors thrown by the executor now take priority over rejections passed to push. If a pushed promise rejects, the repeater will await the execution result and throw an error thrown by the executor instead of the rejected promise.
Changes to combinator methods
Repeater.race
and Repeater.merge
Repeater.merge
yields non-iterable values, so you can call merge on an iterable of promises to get an async iterator which produces values as each promise fulfills.Changes to typescript typings:
Repeater
, RepeaterExecutor
, Push
and other related types now take the type parameters TReturn
and TNext
in line with typescript 3.6’s strict async generator typings.RepeaterBuffer
interface and concrete classes no longer accept a type parameter. All places where the type parameter would have been used, unknown
is used instead. You should never directly add or remove values from buffers.next
and return
methods have been changed to accept PromiseLike<T>
and PromiseLike<TReturn>
respectively as parameters.Changelog
channel@1.0.0 - 2019-06-09
Channel
class now exposes the static methods Channel.race
, Channel.merge
, Channel.zip
and Channel.latest
#4.close
and stop
arguments passed to executor have been merged as the second argument.stop
promise resolves to argument passed to return
if return
is called.push
function now resolves to the value passed to next.push
function now unwraps promise-like values passed to push.remove
is called when the buffer is empty.next
is called for the first time (#10).return
/throw
behave more like the methods do for async generators
.