如何在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
相关产品推荐
相关产品推荐

