无法聚合Twilio API返回的账单数据 async/await调用未生效问题
问题原因
- 你调用
getBillingData后没有等待异步逻辑执行完成就打印result.length,此时Twilio API请求还未返回,数组还没被赋值,所以长度为0。 - 你将
async关键字写在了each方法的回调参数中,只能控制单条记录的处理逻辑,无法让外层代码感知到全部遍历操作已完成。 - 手动维护外部的
result变量收集结果容易出现时序问题,Twilio官方提供了更简单的全量查询方法。
修复代码(推荐写法)
直接用list方法获取全量匹配记录,不需要手动遍历:
const twilio = require("twilio"); const client = twilio( "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "AUTHXXXXXXXXXXXXXXXXXXXXXXXXXXX" ); const filterOpts = { startDate: "2021-08-01", endDate: "2021-08-31", }; async function getBillingData() { // list方法返回Promise,resolve后就是所有符合条件的记录数组 return await client.usage.records.list(filterOpts); } // 必须等待异步操作完成后再操作结果 async function main() { const result = await getBillingData(); console.log(result.length); // 你的Web应用接口逻辑可以在这里把result返回给前端 } main();
如果你一定要用each方法的写法
可以用Promise包裹整个遍历过程,在遍历完成的回调中resolve结果:
const twilio = require("twilio"); const client = twilio( "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "AUTHXXXXXXXXXXXXXXXXXXXXXXXXXXX" ); const filterOpts = { startDate: "2021-08-01", endDate: "2021-08-31", }; function getBillingData() { return new Promise((resolve) => { const result = []; // each方法第三个参数为全部遍历完成后的回调 client.usage.records.each(filterOpts, (record) => { result.push(record); }, () => { resolve(result); }); }) } async function main() { const result = await getBillingData(); console.log(result.length); } main();
内容的提问来源于stack exchange,提问作者the_iceman
相关产品推荐
相关产品推荐

