UNPKG

@lifaon/rx-js-light

Version:

Blazing fast Observables

61 lines (60 loc) 1.96 kB
import {asyncUnsubscribe} from "../../../../../../misc/helpers/async-unsubscribe.mjs"; import {STATIC_COMPLETE_NOTIFICATION} from "../../../../../../misc/notifications/built-in/complete/complete-notification.constant.mjs"; import {createNextNotification} from "../../../../../../misc/notifications/built-in/next/create-next-notification.mjs"; import {singleWithNotifications} from "../../values/single/single-with-notifications.mjs"; export function forkJoin(observables) { const length = observables.length; if (length === 0) { return singleWithNotifications([]); } else { return emit => { const values = Array.from({ length }); const complete = Array.from({ length }); let completeCount = 0; let running = true; const clear = () => { if (running) { running = false; for (let i = 0, l = unsubscribe.length; i < l; i++) { if (!complete[i]) { unsubscribe[i](); } } } }; const unsubscribe = observables.map((subscribe, index) => { const unsubscribe = subscribe(notification => { switch (notification.name) { case 'next': values[index] = notification.value; break; case 'complete': asyncUnsubscribe(() => unsubscribe); if (!complete[index]) { complete[index] = true; completeCount++; } if (completeCount === length) { emit(createNextNotification(values)); if (running) { emit(STATIC_COMPLETE_NOTIFICATION); } clear(); } break; case 'error': emit(notification); clear(); break; } }); return unsubscribe; }); return clear; }; } }