Twilio serverless 函数异步操作执行顺序问题

问题描述 投票:0回答:1

我正在尝试做的事情:

  1. 用户来电会触发数字
    Gather
    (没问题)
  2. 收到数字后,
    Say
    给用户一些东西
  3. Play
    使用
    async/await
  4. 从 API 获取电话号码时播放音乐
  5. 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
,但得到了相同的结果。

我已经没有选择和尝试的事情了。因此我在这里寻求帮助。感谢您的任何意见!

javascript node.js asynchronous twilio
1个回答
0
投票

您看到的行为是正确的,因为 TwiML(由函数返回)在函数完成之前才可用。因此,Twilio 将无法了解 say/play 小部件,除非它们不需要。

解决方案是将其分成两个函数:

  • 第一个基本上按照 ChatGPT 的建议进行。它返回说和播放小部件,因此用户立即开始听到消息。但同时也会触发第二个功能
  • 第二个等待
    fetchDriver
    ,然后修改正在进行的呼叫。然后,您将使用对话的新阶段覆盖呼叫的 TwiML。
© www.soinside.com 2019 - 2024. All rights reserved.