如何将xero-Node包的特定回调转换为async/await
如何将xero-node的分页回调转换为async/await语法?
我来帮你把这段基于回调的分页代码转成更易读的async/await风格。核心思路是把整个分页流程包装成一个Promise,这样就能用async/await来等待所有分页完成,同时保留逐页处理的能力。
先看看你提供的原代码:
/* Called per page /
const onContacts = (err, response, cb) => {
let contacts = response.data;
if (response.finished) // finished paging ....
cb(); // Async support
};
xeroClient.core.contacts.getContacts({
pager: {start:1 / page number */, callback: onContacts}
})
.catch(err => {
console.log(Oh no, an error: ${err});
});
方案1:一次性收集所有分页数据
如果你需要把所有联系人数据一次性拿到手,可以把分页逻辑封装成一个返回Promise的函数,这样就能用await等待全部结果:
// 封装分页逻辑为异步函数 async function getAllContacts(xeroClient) { const allContacts = []; return new Promise((resolve, reject) => { const onContacts = (err, response, cb) => { if (err) { // 出错时直接reject,上层try/catch会捕获 return reject(err); } // 把当前页的联系人数据合并到总数组里 allContacts.push(...response.data); if (response.finished) { // 分页完成,返回所有收集到的数据 return resolve(allContacts); } // 没完成的话,调用cb继续下一页 cb(); }; // 触发分页查询,同时捕获初始化时的错误 xeroClient.core.contacts.getContacts({ pager: { start: 1, callback: onContacts } }).catch(reject); }); } // 使用async/await调用 async function main() { try { const allContacts = await getAllContacts(xeroClient); console.log(`成功获取到 ${allContacts.length} 个联系人`); // 在这里处理所有联系人数据,比如存入数据库、生成报表等 } catch (err) { console.log(`Oh no, an error: ${err}`); } } // 执行主函数 main();
方案2:逐页异步处理数据
如果你的业务需要逐页处理(比如每一页数据都要异步写入数据库,不想一次性加载所有数据到内存),可以在回调里加入async逻辑,确保当前页处理完再继续下一页:
// 定义逐页处理的异步函数 async function processSinglePage(pageContacts) { // 这里写你的逐页业务逻辑,比如批量写入数据库 console.log(`正在处理 ${pageContacts.length} 个联系人`); // 模拟异步操作,比如await db.batchInsert(pageContacts); } async function processAllContacts(xeroClient) { return new Promise((resolve, reject) => { const onContacts = async (err, response, cb) => { if (err) { return reject(err); } // 先异步处理当前页的数据,等处理完再继续下一页 await processSinglePage(response.data); if (response.finished) { console.log("所有分页处理完成"); return resolve(); } cb(); // 继续下一页 }; xeroClient.core.contacts.getContacts({ pager: { start: 1, callback: onContacts } }).catch(reject); }); } // 调用处理函数 async function main() { try { await processAllContacts(xeroClient); } catch (err) { console.log(`Oh no, an error: ${err}`); } } main();
关键说明
- 我们用Promise把整个分页回调流程包裹起来,让async/await可以“等待”整个分页过程完成
- 无论是一次性收集还是逐页处理,都能通过Promise的resolve/reject来统一处理成功和错误场景
- 如果回调里有异步操作(比如方案2里的数据库写入),可以把回调函数定义为async,确保当前页的异步逻辑完成后再调用
cb()触发下一页
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

