@lifaon/rx-js-light
Version:
Blazing fast Observables
69 lines (68 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.forkJoin = void 0;
var async_unsubscribe_1 = require("../../../../../../misc/helpers/async-unsubscribe.cjs");
var complete_notification_constant_1 = require("../../../../../../misc/notifications/built-in/complete/complete-notification.constant.cjs");
var create_next_notification_1 = require("../../../../../../misc/notifications/built-in/next/create-next-notification.cjs");
var single_with_notifications_1 = require("../../values/single/single-with-notifications.cjs");
function forkJoin(observables) {
var length = observables.length;
if (length === 0) {
return (0, single_with_notifications_1.singleWithNotifications)([]);
} else {
return function (emit) {
var values = Array.from({
length: length
});
var complete = Array.from({
length: length
});
var completeCount = 0;
var running = true;
var clear = function () {
if (running) {
running = false;
for (var i = 0, l = unsubscribe.length; i < l; i++) {
if (!complete[i]) {
unsubscribe[i]();
}
}
}
};
var unsubscribe = observables.map(function (subscribe, index) {
var unsubscribe = subscribe(function (notification) {
switch (notification.name) {
case 'next':
values[index] = notification.value;
break;
case 'complete':
(0, async_unsubscribe_1.asyncUnsubscribe)(function () {
return unsubscribe;
});
if (!complete[index]) {
complete[index] = true;
completeCount++;
}
if (completeCount === length) {
emit((0, create_next_notification_1.createNextNotification)(values));
if (running) {
emit(complete_notification_constant_1.STATIC_COMPLETE_NOTIFICATION);
}
clear();
}
break;
case 'error':
emit(notification);
clear();
break;
}
});
return unsubscribe;
});
return clear;
};
}
}
exports.forkJoin = forkJoin;