У меня есть провайдер, который выполняет некоторую работу при загрузке (один раз). Он добавляет тег сценария для карты, а затем при загрузке этого сценария инициализирует карту.
Я хочу, чтобы дети могли использовать неизвестность. Я хотел бы вернуть от этого провайдера обещание, которое либо выдает, если не решено (для ожидания), либо возвращает карту.
Я не могу понять, как это сделать внутри моего компонента. Следует отметить, что я использую следующий JS, поэтому я должен убедиться, что я тоже на стороне клиента.
Я сделал кодовую песочницу , чтобы упростить ее:
function App() {
return (
<MyProvider>
<Suspense fallback={<h1>Loading</h1>}>
<Child />
</Suspense>
</MyProvider>
);
}
Ребенок использует карту и отображает ее, в данном случае это просто текст:
const Child = () => {
const { data } = useContext(context);
const result = data.read();
return <div>Result: {result}</div>;
};
Вот провайдер:
const MyProvider = ({ children }) => {
useEffect(() => {
// I do asynchronous work here which adds a script tag and when
// it is fully loaded initializes a map. How do I pass this promise
// down to children in a way that will work with suspense?
const data = wrapPromise(
new Promise(resolve => {
setTimeout(() => {
console.log("fetched data");
resolve({
name: "Ringo Starr"
});
}, 1000);
})
);
}, []);
return <context.Provider value={{ data }}>{children}</context.Provider>;
};