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

如何在Power BI的Power Query中循环调用API直到状态变为finished?

在Power Query中实现循环检查API状态并获取数据的方案

Power Query本身没有传统的while/for循环语法,通常用递归函数来实现这类轮询逻辑。以下是具体的实现步骤和代码:


1. 定义基础API请求函数

先写一个通用函数用来调用API并解析返回的JSON数据:

GetAPIStatus = (apiUrl as text) as record =>
    let
        // 发起GET请求
        Response = Web.Contents(apiUrl),
        // 解析JSON响应为记录
        ParsedJson = Json.Document(Response)
    in
        ParsedJson;

2. 实现递归轮询函数

核心逻辑是:每次调用API检查状态,若状态为null则等待一段时间后重试;若状态为finished则返回目标数据;同时加入重试次数限制避免无限递归:

PollAPIUntilFinished = (apiUrl as text, maxRetries as number, currentRetry as number) as any =>
    let
        // 获取当前API状态
        CurrentStatus = GetAPIStatus(apiUrl),
        // 提取状态字段(根据你的API实际字段名调整,比如"status")
        StatusValue = CurrentStatus[status],
        // 分支判断
        Result = if StatusValue = "finished" then
                    // 状态完成,返回目标数据(根据API结构调整,比如"data"字段)
                    CurrentStatus[data]
                else if StatusValue = null and currentRetry < maxRetries then
                    // 状态未就绪,等待5秒后递归重试(可调整等待时长)
                    Wait = Duration.FromSeconds(5),
                    WaitFor = DateTime.LocalNow() + Wait,
                    Loop = while DateTime.LocalNow() < WaitFor do (),
                    PollAPIUntilFinished(apiUrl, maxRetries, currentRetry + 1)
                else
                    // 重试次数耗尽或状态异常,返回错误信息
                    error "API状态未在指定次数内变为finished,当前状态:" & Text.From(StatusValue)
    in
        Result;

3. 调用轮询函数

设置API地址、最大重试次数(比如20次),初始重试次数从0开始:

FinalData = PollAPIUntilFinished("https://your-api-url-here", 20, 0)

关键注意事项

  • 等待时长调整:根据API的处理速度设置合理的等待时间,避免过于频繁请求触发限流。
  • 状态字段适配:代码中的status和data字段需要根据你的实际API返回结构修改。
  • Web.Contents权限:首次运行时可能需要设置Web.Contents的隐私级别(选择"公共"或对应的权限),否则会报错。
  • 异常处理:可以根据需求扩展错误处理逻辑,比如捕获网络异常后重试。

内容的提问来源于stack exchange,提问作者Alan Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:32:06