我正在尝试做的事情:
Gather
(没问题)Say
给用户一些东西Play
使用 async/await
Dial
表示 API 响应中的电话号码。我的代码:
gather-extension.js
(收集和重试都是工作,因此不提供重试js)
exports.handler = async (context, event, callback) => {
const retryMax = 2;
const twiml = new Twilio.twiml.VoiceResponse();
const gather = twiml.gather({
action: `./fetch-driver-phone`,
method: 'GET',
timeout: 2
});
gather.say('Thanks for calling');
//retry
twiml.redirect(`./retry-gather-ext?retry=1&retry_max=${retryMax}`);
return callback(null, twiml);
}
fetch-driver-phone.js
(这就是问题所在)
exports.handler = async (context, event, callback) => {
const twiml = new Twilio.twiml.VoiceResponse();
const callerPhoneNumber = event.From;
const extension = event.Digits;
console.log('Caller Phone Number:', callerPhoneNumber);
if (extension == null) {
//handle error
}
twiml.say("Please wait while we connect you");
twiml.play("http://com.twilio.sounds.music.s3.amazonaws.com/MARKOVICHAMP-Borghestral.mp3");
try {
console.log("Calling API");
const result = await fetchDriver(extension, twiml)
console.log(result);
twiml.dial().number(result);
callback(null, twiml);
} catch(error) {
console.error(error);
twiml.say('We are unable to process your request at this time.');
twiml.hangup();
callback(error);
}
}
const fetchDriver = async (code) => {
console.log('Extension Digits:', code);
return new Promise((resolve) => {
setTimeout(() => {
resolve('phone number');
}, 5000);
});
}
期望什么:
我希望
Say
和 Play
在await 语句之前执行。然后在获取响应后调用 Dial
。
发生了什么:
Say
和 Play
不会被触发,直到等待的 5000 毫秒结束,然后 Dial
被完全忽略。我尝试过使用实际的 API,并且得到了相同的结果。
当我使用chatGPT或Twilio时支持AI。两者都给了我在
callback(null, twmil)
之后添加 Play
的解决方案。这确实解决了计时问题,但是,它导致 Dial
永远不会被调用。
然后两个人工智能都建议添加一个额外的
VoiceResponse
,在第一个callback(null, twmil)
之后使用。这会导致响应 console.log 显示在第二次调用开始时。第一个电话仍然会卡在Play
音乐中。
我也尝试过使用
Enqueue
,但得到了相同的结果。
我已经没有选择和尝试的事情了。因此我在这里寻求帮助。感谢您的任何意见!
您看到的行为是正确的,因为 TwiML(由函数返回)在函数完成之前才可用。因此,Twilio 将无法了解 say/play 小部件,除非它们不需要。
解决方案是将其分成两个函数:
fetchDriver
,然后修改正在进行的呼叫。然后,您将使用对话的新阶段覆盖呼叫的 TwiML。