Skip to content

Instantly share code, notes, and snippets.

@Sawtaytoes
Last active February 27, 2020 11:32
Show Gist options
  • Select an option

  • Save Sawtaytoes/7b6bf968510fe88df3ec98846a641779 to your computer and use it in GitHub Desktop.

Select an option

Save Sawtaytoes/7b6bf968510fe88df3ec98846a641779 to your computer and use it in GitHub Desktop.
`createIteratorSubject` allows someone to create an observable out of a generator and tell RxJS when to pull the next value instead of relying on the official implementation which creates backpressure.
const { BehaviorSubject, Subject } = require('rxjs')
const { map, tap, withLatestFrom } = require('rxjs/operators')
const createIteratorSubject = (
iterator,
) => {
const iterator$ = (
new BehaviorSubject()
)
const pushNextValue = ({
done,
value,
}) => {
done
&& value === undefined
? (
iterator$
.complete()
)
: (
iterator$
.next(value)
)
}
iterator$
.push = (
value,
) => (
pushNextValue(
iterator
.next(value)
)
)
iterator$
.push()
return iterator$
}
module.exports = createIteratorSubject
@Seairth

Seairth commented Aug 19, 2019

Copy link
Copy Markdown

I found the above snippet difficult to read. Consider using a different name for subject, as well as a more compact format overall. For example:

const { BehaviorSubject } = require('rxjs')

function createIteratorSubject(iterator) {
  const subject$ = new BehaviorSubject();

  subject$.push = function(value) {
    const {done, value} = iterator.next(value);.

    if (done && value === undefined) {
        subject$.complete();
    } else {
        subject$.next(value);
    } 
  }

  subject$.push()

  return subject$
}

module.exports = createIteratorSubject

@anilanar

Copy link
Copy Markdown

What an interesting code format, do you have an auto formatter for that?

@Sawtaytoes

Copy link
Copy Markdown
Author

@anilanar I'd love to have an auto-formatter and will be looking into using ESLint rules to achieve it (if that's even possible).

Unlike Prettier, there are a set of rules I follow so it's easy for someone else to replicate and get the same results. At my last job, you'd be unable to tell my code apart from my coworkers'. In fact, there was one bug we ended up fixing in separate PRs with the exact same solution line-by-line.

@Sawtaytoes

Copy link
Copy Markdown
Author

@anilanar I now have an eslint extension available.

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