123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import { Observable } from '../Observable';
- import { SchedulerLike } from '../types';
- import { iterator as Symbol_iterator } from '../symbol/iterator';
- import { isFunction } from '../util/isFunction';
- import { executeSchedule } from '../util/executeSchedule';
- /**
- * Used in {@link scheduled} to create an observable from an Iterable.
- * @param input The iterable to create an observable from
- * @param scheduler The scheduler to use
- */
- export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
- return new Observable<T>((subscriber) => {
- let iterator: Iterator<T, T>;
- // Schedule the initial creation of the iterator from
- // the iterable. This is so the code in the iterable is
- // not called until the scheduled job fires.
- executeSchedule(subscriber, scheduler, () => {
- // Create the iterator.
- iterator = (input as any)[Symbol_iterator]();
- executeSchedule(
- subscriber,
- scheduler,
- () => {
- let value: T;
- let done: boolean | undefined;
- try {
- // Pull the value out of the iterator
- ({ value, done } = iterator.next());
- } catch (err) {
- // We got an error while pulling from the iterator
- subscriber.error(err);
- return;
- }
- if (done) {
- // If it is "done" we just complete. This mimics the
- // behavior of JavaScript's `for..of` consumption of
- // iterables, which will not emit the value from an iterator
- // result of `{ done: true: value: 'here' }`.
- subscriber.complete();
- } else {
- // The iterable is not done, emit the value.
- subscriber.next(value);
- }
- },
- 0,
- true
- );
- });
- // During finalization, if we see this iterator has a `return` method,
- // then we know it is a Generator, and not just an Iterator. So we call
- // the `return()` function. This will ensure that any `finally { }` blocks
- // inside of the generator we can hit will be hit properly.
- return () => isFunction(iterator?.return) && iterator.return();
- });
- }
|