【问题标题】:Not able to aggregate data returned from the twilio api无法聚合从 twilio api 返回的数据
【发布时间】:2021-12-07 02:15:25
【问题描述】:

我正在尝试从 Twilio API 获取计费数据并将返回的值保存在一个变量中,以便我可以返回它并在我的网络应用程序中显示它。我知道它与异步有关,我尝试使用 async 和 await 但无法使其工作。

const twilio = require("twilio");

client = twilio(
  "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "AUTHXXXXXXXXXXXXXXXXXXXXXXXXXXX"
);

const filterOpts = {
  startDate: "2021-08-01",
  endDate: "2021-08-31",
};

let result = []
function getBillingData() {
  client.usage.records.each(filterOpts, async (record) => {
    let temp = await record;
    result.push(temp);
  });
}


getBillingData();
console.log(result.length);

当我尝试运行它时,它会打印出0

【问题讨论】:

标签: javascript node.js asynchronous promise twilio


【解决方案1】:
const filterOpts = {
  startDate: "2021-08-02",
  endDate: "2021-08-02",
  callback: (data) => {result.push(data);} ,
  done: () => {console.log(result.length);},
};


async function getBillingData() {
  client.usage.records.each(filterOpts);
}

async function getData() {
  await getBillingData();
};

getData();

我通过documentation 找到我可以传递两个可选参数来完成我的工作。

【讨论】:

  • The_iceman,从文档中,我了解到您应该使用.each() 而不是.list()。它返回 Promise 包装的资源(结果)。你只需要准备你的filterOptions.startDate.endDate 属性;省略 .callback.done.list() 将返回一个 Q 承诺,您可以(并且可以说应该)使用 Promise.resolve() 将其转换为原生 js 承诺(或依靠 asyncFunction 自动执行此操作)。
【解决方案2】:

这里是 Twilio 开发者宣传员。

我认为这个问题是您的 JS 中的异步调用的竞争条件,并且您的代码在异步调用完成之前返回。我认为each 调用也是异步的。试试这个:


async function getBillingData() {
  let result = []
  await client.usage.records.each(filterOpts, async (record) => {
    let temp = await record;
    result.push(temp);
  });
  return result;
}


getBillingData().then((result) => {
  console.log(result.length);
})

现在getBillingData 函数是async 函数,因此它可以在调用client.usage.records.each 时使用await。它还在自身内部收集results,并在函数解析时返回值。

最后,我们使用getBillingData().then() 来确保在记录之前收集并返回数据。

【讨论】:

  • 不行,还是打印0。感谢大家的帮助,终于找到办法了。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多