August 21, 2021
Inside Out Async
I nerdsniped myself and made a handy async utility that turns Promises and AsyncGenerators inside out. This is very handy for testing and useful if you're done non trivial transformations of events into async generator or promised based apis. I call it Inside Out Async.
My development journey was posted in realtime and preserved below.
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![export function defer<T>(): IDeferred<T> {
let reject
let resolve
const promise = new Promise<T>((resolveFunc, rejectFunc) => {
resolve = resolveFunc
reject = rejectFunc
})
return {
promise,
reject,
resolve,
}
}
export interface IDeferred<T> {
promise: Promise<T>
resolve: (value: T) => void
reject: (error: Error) => void
}](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Fmedia_attachments%2Ffiles%2F106%2F722%2F544%2F298%2F747%2F975%2Foriginal%2Fb730eeb151180b27.jpeg&w=3840&q=75)
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Fmedia_attachments%2Ffiles%2F106%2F723%2F961%2F317%2F714%2F707%2Foriginal%2Fdab4155190466ded.jpeg&w=3840&q=75)
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![it('queues up values until queueError is called', async () => {
const deferred = deferGenerator<number, undefined>()
deferred.queueValue(1)
deferred.queueValue(2)
deferred.queueValue(3)
deferred.queueError(new Error('oh no!'))
const values: number[] = []
try {
for await (const val of deferred.generator) {
values.push(val)
}
throw new Error('should have errored')
} catch (e) {
assert.equal(e.message, 'oh no!')
}
assert.deepEqual(values, [1, 2, 3])
})](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Fmedia_attachments%2Ffiles%2F106%2F724%2F124%2F442%2F861%2F736%2Foriginal%2Fe00ddf77e1e0d2d3.jpeg&w=3840&q=75)
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![Francis 🏴☠️ Gulotta icon](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Faccounts%2Favatars%2F000%2F002%2F123%2Foriginal%2F2d5a76671fa4a4a1.png&w=128&q=75)
Francis 🏴☠️ Gulotta
![const executeSubscription = async (query: string) => {
const client = createClient({
url: 'ws://localhost:3339',
webSocketImpl: WebSocket,
})
const values = deferGenerator()
const unsubscribe = client.subscribe(
{ query },
{
next: ({data}) => {
values.queueValue(data)
},
error: (error: Error) => {
values.queueError(error)
},
complete: () => values.queueReturn(),
},
)
return { values: values.generator, unsubscribe }
}](/_next/image/?url=https%3A%2F%2Fassets.toot.cafe%2Fmedia_attachments%2Ffiles%2F106%2F729%2F859%2F740%2F062%2F911%2Foriginal%2Fc73d3376956b5fd1.jpeg&w=3840&q=75)
Roborooter.com © 2024
Powered by ⚡️ and 🤖.
Powered by ⚡️ and 🤖.