You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:27:47