如何保存多API请求的JSON响应?(Azure DevOps WIT场景)
问题描述
我通过API请求获取了大量工作项Id:
const data = { query: "Select [System.Id], [System.Title], [System.State] From WorkItems Where [System.WorkItemType] = 'User Story' order by [Microsoft.VSTS.Common.Priority] asc, [System.CreatedDate] desc" }; const list = await this.post<any>('wit/wiql', data); let ids: string[] = []; for (let i = 0; i < list.data.workItems.length; i++) { ids.push(list.data.workItems[i].id); }
需要使用这些Id调用另一个API端点,但该端点单次请求最多接受200个Id。我尝试分批发起请求并保存结果,代码如下:
let ids2: string[] = []; let userStories; for (const id of ids) { if (ids2.length == 200) { userStories += await this.get<any>(`wit/workitems?ids=${ids2}`); ids2.splice(0); } ids2.push(id); } if (ids2.length > 0) { userStories += await this.get<any>(`wit/workitems?ids=${ids2}`); }
但得到的userStories值为'undefined[object Object][object Object]',尝试多种保存方式都无效,请问如何正确保存数据以便后续轻松使用?
解决方案
问题原因
- 未初始化变量:
userStories未设置初始值,默认是undefined,使用+=拼接时会将其转为字符串,导致结果开头出现undefined。 - 对象错误拼接:API返回的是对象/数组,直接用
+=会将其转为[object Object]字符串,而非合并数据。 - 分批逻辑繁琐:逐个添加ID到临时数组的方式不够高效,且容易出错。
修正代码
// 初始化空数组存储所有工作项 const userStories: any[] = []; const batchSize = 200; // 按200个ID为一批拆分原数组 for (let i = 0; i < ids.length; i += batchSize) { const batchIds = ids.slice(i, i + batchSize); // 调用API,确保ID参数是逗号分隔的字符串 const response = await this.get<any>(`wit/workitems?ids=${batchIds.join(',')}`); // 将返回的工作项数组合并到总数组(根据实际API返回结构调整response.data的路径) userStories.push(...response.data); } // 此时userStories是包含所有工作项的平级数组,可直接用于后续处理
关键说明
- 数组拆分优化:用
slice直接拆分原ID数组,比手动维护临时数组更简洁可靠。 - 正确合并数据:使用
push(...array)将每批返回的工作项元素展开添加到总数组,避免嵌套数组。 - 参数格式正确:通过
batchIds.join(',')生成逗号分隔的ID字符串,符合API参数要求。 - 类型可选优化:如果使用TypeScript,建议定义工作项接口替换
any,提升代码类型安全性。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

