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

如何在page.on回调执行期间暂停主线程,等待回调完成?

实现监听事件并暂停主线程直到回调完成

原代码的问题在于page.on注册的异步回调会和主线程并发执行,主线程不会等待回调逻辑完成就继续往下走。要实现主线程暂停直到回调处理完毕,有两种可行方案:

方案一:直接使用page.wait_for_request(推荐,适合单次等待场景)

如果你的需求是等待特定请求出现并处理,wait_for_request本身就是阻塞式的API,能让主线程暂停直到目标请求触发,之后再执行处理逻辑,天然满足你的需求:

async def mission(self):
    logger.info('Main operation before waiting')
    # 等待目标请求出现,主线程会暂停在这里
    request = await self.page.wait_for_request(lambda req: "https://some_request.com" in req.url)
    # 执行处理逻辑,主线程继续暂停直到resolve完成
    await Solution(page=self.page).resolve()
    logger.info('Main operation after processing')

方案二:用asyncio.Event同步主线程与回调(适合持续监听场景)

如果需要持续监听request事件,且某次触发后要暂停主线程,可通过asyncio.Event实现同步:

import asyncio

async def mission(self):
    # 创建事件对象用于同步
    callback_done = asyncio.Event()

    async def handler(request):
        try:
            if "https://some_request.com" in request.url:
                await Solution(page=self.page).resolve()
                # 处理完成后标记事件,唤醒主线程
                callback_done.set()
                # 若只需处理一次,可移除监听避免重复触发
                self.page.remove_listener('request', handler)
        except Exception as e:
            # 异常时也要标记事件,防止主线程无限等待
            callback_done.set()
            raise e

    logger.info('Main operation before registering listener')
    self.page.on('request', handler)
    logger.info('Waiting for callback to finish...')
    # 主线程暂停,直到事件被标记完成
    await callback_done.wait()
    logger.info('Main operation after callback completed')

注意事项

  • 方案一中wait_for_request会自动等待第一个匹配的请求,若需要等待多个请求,可循环调用或结合方案二。
  • 方案二中务必处理异常,否则如果回调抛出错误,事件未被设置,主线程会一直阻塞。

内容的提问来源于stack exchange,提问作者Ziqi Xiao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:13:43