rvx
Version:
A signal based rendering library
35 lines • 1.11 kB
JavaScript
import { isolate } from "../core/isolate.js";
import { $ } from "../core/signals.js";
import { nest } from "../core/view.js";
import { ASYNC } from "./async-context.js";
export function nestAsync(source, component, pending, rejected) {
const state = $({ type: 0, value: undefined });
let promise;
if (typeof source === "function") {
promise = isolate(source);
}
else {
promise = source;
}
const ac = ASYNC.current;
promise.then(value => {
state.value = { type: 1, value };
}, (value) => {
state.value = { type: 2, value };
if (ac === undefined && rejected === undefined) {
void Promise.reject(value);
}
});
ac?.track(promise);
return nest(state, state => {
switch (state.type) {
case 0: return pending?.();
case 1: return component?.(state.value);
case 2: return rejected?.(state.value);
}
});
}
export function Async(props) {
return nestAsync(props.source, props.children, props.pending, props.rejected);
}
//# sourceMappingURL=async.js.map