【发布时间】:2019-07-07 18:49:20
【问题描述】:
目前正在尝试反应钩子和反应悬念。我正在尝试制作一个钩子useApolloQuery,它会获取一些数据并承诺等待数据加载。
我将获取数据的逻辑放在 useEffect 中,但如果你立即在组件中抛出一个 promise(并因此暂停它),效果似乎永远不会运行。
这是我的代码:(或代码框链接:https://codesandbox.io/s/x73pwj164q)
function createPromiseResolver() {
let resolve;
const promise = new Promise(newResolver => {
resolve = newResolver;
});
return { resolve, promise };
}
function useApolloQuery() {
const [data, setData] = useState();
const promsieResolver = createPromiseResolver();
console.log("this runs");
useEffect(() => {
console.log("this doesn't run");
const timeoutId = setTimeout(() => {
setData("Some fake data");
promsieResolver.resolve();
}, 500);
return () => clearTimeout(timeoutId);
});
if (!data) throw promsieResolver.promise;
return data;
}
function App() {
const data = useApolloQuery();
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>{data}</h2>
</div>
);
}
所以在该代码中只有第一个 console.log 运行,因为 useEffect 钩子永远不会运行
悬念应该这样运作吗?有什么办法让它工作吗?
【问题讨论】:
标签: javascript reactjs