Pyscript异步请求需强制等待数据获取的实现问题
解决PyScript中异步请求等待问题
核心问题分析
你当前代码里,asyncio.create_task(get_tp_data())返回的是Task对象,并非请求完成后的实际数据。按钮触发的run_comparison是同步函数,无法直接等待异步任务完成,所以需要调整异步逻辑的调用方式。
修正后的代码方案
1. 先优化异步请求函数
简化get_tp_data,已解析的JSON数据无需额外await:
import asyncio from pyscript import request async def get_tp_data(): response = await request("你的服务器地址", method="GET") tp_response = await response.json() tp_expansion = tp_response['expansion'] tp_contains = tp_expansion['contains'] print(tp_contains) # 确认数据获取成功 return tp_contains # 直接返回解析好的数据
2. 方案一:将按钮回调改为异步(推荐)
PyScript支持把异步函数作为事件回调,直接在函数内等待请求完成:
async def run_comparison(*ags, **kws): # 等待异步请求完成,拿到实际数据 tp_contains = await get_tp_data() # 在这里编写你的数据处理逻辑 print("开始处理数据:", tp_contains) # 示例:执行对比操作 # ...
对应的HTML按钮绑定无需修改(PyScript会自动处理异步回调):
<button py-click="run_comparison()">执行对比</button>
3. 方案二:提前发起请求,点击时等待结果
如果需要提前触发请求,在按钮点击时再等待结果,可保存Task对象后在异步回调中await:
# 提前创建异步任务(此时请求已开始执行) tp_task = asyncio.create_task(get_tp_data()) async def run_comparison(*ags, **kws): # 等待提前发起的任务完成,获取结果 tp_contains = await tp_task # 处理数据逻辑 print("处理提前获取的数据:", tp_contains) # ...
关键说明
- 同步函数无法直接使用
await,必须将按钮回调改为异步函数,PyScript会自动调度异步执行。 - 不要用阻塞式的“强制等待”方法(比如
run_until_complete),这会阻塞PyScript主线程导致页面无响应,异步场景下正确的做法是使用await。
内容的提问来源于stack exchange,提问作者Colin Curtain
相关产品推荐
相关产品推荐

