获取正在进行的,去电的Twilio通话的状态

时间:2019-12-19 01:18:28

标签: node.js twilio

我目前有以下内容:

twilio.calls
  .create({
    url: process.env.TWILIO_OUTGOING_XML,
    to: currentNumber,
    from: process.env.TWILIO_FROM_NUMBER
  })
  .then(function (call) {
    while (true) {
      getCallStatus(call);
    }
  });

function getCallStatus(x) {
  twilio.calls(x)
    .fetch()
    .then(call => console.log(call.status));
}

但是,使用while循环时,它将不会输出调用状态。当我删除while循环时,状态会记录到控制台,但是它只显示queued,因为在初始创建时自然只获取一次状态。因此,如何确保我始终可以获取最新的通话状态?

2 个答案:

答案 0 :(得分:1)

您的while循环将“锁定”您的所有代码命令,它将填满JS引擎的堆栈,这意味着twilio.calls(x)已执行,但从未console.log(call.status)被调用(js引擎使命令保持执行状态)永远排在队列中。

将while循环更改为setInterval之类的异步操作:

twilio.calls
  .create({
    url: process.env.TWILIO_OUTGOING_XML,
    to: currentNumber,
    from: process.env.TWILIO_FROM_NUMBER
  })
  .then(function (call) {
    setInterval(function() {
      getCallStatus(call);
    }, 1000); // check call status every second
  });

function getCallStatus(x) {
  twilio.calls(x)
    .fetch()
    .then(call => console.log(call.status));
}

答案 1 :(得分:1)

哇...确定呼叫状态的方法在您的呼叫堆栈和服务器资源上有点过于复杂。绝对不是很可扩展-您能想象您是否正在服务数百个(如果不是)数千个电话?

您应该查看statusCallBackEvents。它们通过添加2个其他属性为您提供一种监视呼叫状态的方法,一个属性与您的端点一起接收状态更新,另一个属性与您指定要跟踪的事件。它比您描述的方式占用的资源少得多,并且是此类任务的预期用例。

示例:

twilio.calls
  .create({
    statusCallback: `https://${YOUR_API_ENDPOINT}/events`,
    statusCallbackEvent: ['initiated', 'answered', ...],
    statusCallback: 'POST',
    url: process.env.TWILIO_OUTGOING_XML,
    to: currentNumber,
    from: process.env.TWILIO_FROM_NUMBER
  })

您基本上是在Twilio(Pub)与服务器/ lambda /无论(Sub)之间创建Pub / Sub关系,指示Twilio将指定的呼叫状态事件发送到您提供的端点。现在,您要做的所有事情就是处理Twilio发送给您的任何事件。

这是一个更清洁的解决方案。您可能会在小时调试竞赛条件和其他不必要的事物 ...

上节省数小时。
相关问题