UNPKG

@fbltd/async

Version:

Miscellaneous async utils

26 lines (25 loc) 866 B
import { memo, useEffect, useState } from "react"; import { observationState } from "../../observe.state.js"; import { usePromise } from "./utils.js"; export function Reactive(fn) { return memo((props) => { const [key, setKey] = useState(false); const abortPromise = usePromise(); useEffect(() => abortPromise.resolve, []); observationState.isObserved = true; const jsx = fn(props); const deps = observationState.getDeps(); observationState.isObserved = false; if (deps.size) { let prom = [abortPromise.promise]; deps.forEach(d => prom.push(d.next())); Promise.race(prom) .then(() => { if (abortPromise.isFulfilled) return; setKey(!key); }); } return jsx; }); }