Skip to content

Instantly share code, notes, and snippets.

@anonrig
Created October 26, 2022 15:22
Show Gist options
  • Select an option

  • Save anonrig/60ae77cd3b59fdf0069385cca103bff2 to your computer and use it in GitHub Desktop.

Select an option

Save anonrig/60ae77cd3b59fdf0069385cca103bff2 to your computer and use it in GitHub Desktop.
Async-iterator
const Stream = require('stream');
const { EventEmitter } = require('events');
const controller = new AbortController();
class Custom extends EventEmitter {
[Symbol.asyncIterator]() {
const stream = new Stream.Readable({
destroy(_error, callback) {
console.log('error called')
callback(null)
},
read() { },
autoDestroy: true,
objectMode: true,
signal: controller.signal,
})
this.on('custom-event', (args) => {
stream.push(args)
})
return stream
}
}
const instance = new Custom()
process.nextTick(() => {
let iterator = 0;
setInterval(() => {
iterator++
instance.emit('custom-event', 'current iterator ' + iterator)
}, 500)
})
setTimeout(() => {
controller.abort();
console.log('hello')
}, 2000)
async function run() {
for await (let payload of instance[Symbol.asyncIterator]()) {
console.log('payload', payload)
if (payload.filename === 'current iterator 5') {
break
}
}
}
run().then(() => console.log('bitti')).catch(error => console.log('error', error))
@anonrig
Copy link
Author

anonrig commented Oct 26, 2022

Logs:

➜  async-iterator node index.js
payload current iterator 1
payload current iterator 2
payload current iterator 3
error called
hello
error AbortError: The operation was aborted
    at EventTarget.onAbort (node:internal/streams/add-abort-signal:37:20)
    at [nodejs.internal.kHybridDispatch] (node:internal/event_target:731:20)
    at EventTarget.dispatchEvent (node:internal/event_target:673:26)
    at abortSignal (node:internal/abort_controller:308:10)
    at AbortController.abort (node:internal/abort_controller:338:5)
    at Timeout._onTimeout (/Users/yagiz/Desktop/async-iterator/index.js:39:14)
    at listOnTimeout (node:internal/timers:564:17)
    at process.processTimers (node:internal/timers:507:7) {
  code: 'ABORT_ERR',
  [cause]: DOMException [AbortError]: This operation was aborted
      at new DOMException (node:internal/per_context/domexception:53:5)
      at AbortController.abort (node:internal/abort_controller:336:18)
      at Timeout._onTimeout (/Users/yagiz/Desktop/async-iterator/index.js:39:14)
      at listOnTimeout (node:internal/timers:564:17)
      at process.processTimers (node:internal/timers:507:7)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment