@lifaon/rx-js-light
Version:
Blazing fast Observables
61 lines (60 loc) • 1.96 kB
JavaScript
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;
};
}
}