如何实现依赖式getJSON()调用?批量获取Trello卡片历史数据
实现Trello卡片动作数据拉取并追加到表格的完整指南
嘿,我来给你一步步拆解这个Trello API的实现流程,不管你是用前端的jQuery还是原生JavaScript,我都给你写好具体的代码示例,照着来就行~
1. 先搞定前置准备:获取Trello API密钥和令牌
首先你得拿到Trello的API访问权限:
- 去Trello开发者页面申请
API Key(免费就能获取) - 生成一个
Token(需要授权你的账号访问目标看板,这样API才能读取看板数据)
这俩参数是所有请求的必备项,后面每个API调用都得带上。
2. 第一步:拉取目标看板的所有卡片ID数组
先调用Trello的看板卡片API,把目标看板下所有卡片的ID提取出来,存到数组里。这里给你两种常见写法:
用jQuery getJSON 的写法
如果你的项目已经在用jQuery,这个写法更顺手:
// 替换成你自己的看板ID、API Key和Token const boardId = "你的看板ID"; const apiKey = "你的Trello API Key"; const token = "你的Trello授权Token"; let cardIds = []; // 发起请求获取看板下所有卡片 $.getJSON(`https://api.trello.com/1/boards/${boardId}/cards?key=${apiKey}&token=${token}`, function(cards) { // 从返回的卡片数据里提取ID,存到数组 cardIds = cards.map(card => card.id); // 拿到ID数组后,立刻执行下一步:拉取每个卡片的动作数据 fetchCardActions(cardIds); }) .fail(function(err) { console.error("获取卡片ID失败啦:", err); });
原生JavaScript fetch 写法(更现代)
如果不用jQuery,用原生JS的异步函数写法更符合现代开发习惯:
const boardId = "你的看板ID"; const apiKey = "你的Trello API Key"; const token = "你的Trello授权Token"; let cardIds = []; // 异步函数获取卡片ID数组 async function getCardIds() { try { const response = await fetch(`https://api.trello.com/1/boards/${boardId}/cards?key=${apiKey}&token=${token}`); const cards = await response.json(); cardIds = cards.map(card => card.id); // 拿到ID后触发下一步 await fetchCardActions(cardIds); } catch (err) { console.error("获取卡片ID失败啦:", err); } } // 启动第一步流程 getCardIds();
3. 第二步:遍历卡片ID,拉取动作数据存入action_tableData
这一步要注意Trello的请求频率限制(免费版大概100次/分钟),所以每个请求之间加个小延迟,避免被限流返回429错误。
定义拉取动作数据的函数(原生JS版)
// 用来存储所有卡片动作数据的数组 let action_tableData = []; async function fetchCardActions(cardIds) { // 逐个遍历卡片ID,异步拉取动作 for (const cardId of cardIds) { try { // 调用Trello卡片动作API,可通过`filter`参数筛选你需要的动作类型(比如只看创建、更新) const response = await fetch(`https://api.trello.com/1/cards/${cardId}/actions?key=${apiKey}&token=${token}&filter=all`); const actions = await response.json(); // 把当前卡片的动作数据存入数组,建议额外加个cardId字段方便关联 const cardActions = actions.map(action => ({ ...action, cardId: cardId // 标记这条动作属于哪个卡片 })); action_tableData.push(...cardActions); // 加500ms延迟,避免触发限流 await new Promise(resolve => setTimeout(resolve, 500)); } catch (err) { console.error(`拉取卡片${cardId}的动作失败:`, err); // 就算某个卡片失败,也继续处理下一个 continue; } } // 所有动作拉取完成后,执行最后一步:追加到表格 appendToTable(action_tableData); }
jQuery版的遍历处理(回调异步)
如果用jQuery,因为是回调式异步,得用递归或者计数器来处理遍历:
let action_tableData = []; let currentCardIndex = 0; function fetchCardActions(cardIds) { // 所有卡片处理完就结束 if (currentCardIndex >= cardIds.length) { appendToTable(action_tableData); return; } const cardId = cardIds[currentCardIndex]; $.getJSON(`https://api.trello.com/1/cards/${cardId}/actions?key=${apiKey}&token=${token}&filter=all`, function(actions) { const cardActions = actions.map(action => ({...action, cardId})); action_tableData.push(...cardActions); currentCardIndex++; // 延迟500ms处理下一个卡片 setTimeout(() => fetchCardActions(cardIds), 500); }) .fail(function(err) { console.error(`拉取卡片${cardId}的动作失败:`, err); currentCardIndex++; setTimeout(() => fetchCardActions(cardIds), 500); }); }
4. 第三步:把action_tableData追加到table对象
这里分两种情况,如果你是前端DOM表格,就这么写;如果是后端数据表格(比如数据库表),就对应批量插入即可。
前端DOM表格追加示例
function appendToTable(data) { // 替换成你页面中表格的ID const table = document.getElementById("your-target-table-id"); // 找到表格的tbody,没有就直接用table本身 const tbody = table.querySelector("tbody") || table; // 遍历每条动作数据,创建表格行 data.forEach(action => { const row = document.createElement("tr"); // 这里根据你需要展示的字段来写单元格内容,比如动作类型、时间、执行者 row.innerHTML = ` <td>${action.id}</td> <td>${action.type}</td> <td>${new Date(action.date).toLocaleString()}</td> <td>${action.memberCreator?.fullName || "未知用户"}</td> <td>${action.cardId}</td> `; tbody.appendChild(row); }); console.log("动作数据已经成功追加到表格啦!"); }
后端数据表格追加示例(比如Node.js)
如果是后端把数据存到数据库表,比如用SQL或者ORM:
// 假设你用的是sequelize ORM,action_tableData是模型对应的数组 async function appendToTable(data) { try { // 批量创建记录 await ActionModel.bulkCreate(data); console.log("动作数据已成功追加到数据库表!"); } catch (err) { console.error("追加数据失败:", err); } }
几个关键提醒
- 请求限流:一定要加延迟或者控制并发数,不然Trello会返回429错误,限制你的请求。
- 权限检查:确保你的Token有访问目标看板的权限,不然会返回401/403错误。
- 字段筛选:调用动作API时,用
filter参数指定需要的动作类型(比如filter=createCard,updateCard),减少返回的数据量,提升速度。 - 错误处理:每个请求都加错误捕获,避免一个卡片失败导致整个流程中断。
内容的提问来源于stack exchange,提问作者Quirk
相关产品推荐
相关产品推荐

