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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:10