[React] Use Async Functions in a Recoil Selector
Instead of just returning a value from a recoil selector, you can return any promise, which means that you can do asynchronous functions in recoil selectors (this is a little like a redux thunk).
The huge bonus is that you don't have to do anything different when actually calling the selector - use can use useRecoilValue
in the same way that you would from a normal selector.
The only thing you must do is somewhere in the component tree, wrap any component that uses an async selector with a <React.Suspense>
tag with a fallback
prop that will tell React what to display when the async selector isn't loaded yet.
Component:
import React from "react"; import { useRecoilValue } from "recoil"; import { highScores } from "./selectors"; const HighScore = () => { const score = useRecoilValue(highScores); return <div>High Score: {score}</div>; }; export default HighScore;
Selectors.js:
import { selector } from "recoil"; import { gameScore } from "./atoms"; const fetchHighScores = async () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(303); }, 1000); }); }; const highScores = selector({ key: "highScores", get: async ({ get }) => { return await fetchHighScores(); } }); export { highScores };
Use:
import React from "react"; import "./styles.css"; import { RecoilRoot } from "recoil"; import HighScore from "./HighScore"; function App() { return ( <RecoilRoot> <div className="App"> <React.Suspense fallback={<div>Loading...</div>}> <HighScore /> </React.Suspense> </div> </RecoilRoot> ); } export default App;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-06-17 [Cypress] Use the Most Robust Selector for Cypress Tests
2019-06-17 [Cypress] Assert on Your Redux Store with Cypress
2019-06-17 [Cypress] Mock Your Backend with Cypress
2018-06-17 [CSS3] Use Sticky Positioning for Section Headers
2018-06-17 [CSS3] Make a horizontal-scrolling Menu
2018-06-17 [React] Refactor a connected Redux component to use Unstated
2017-06-17 [PReact] Use Link State to Automatically Handle State Changes