我目前有以下内容:
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
,因为在初始创建时自然只获取一次状态。因此,如何确保我始终可以获取最新的通话状态?
答案 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发送给您的任何事件。
这是一个更清洁的解决方案。您可能会在小时调试竞赛条件和其他不必要的事物 ...
上节省数小时。