【问题标题】:How to handle async API calls in Actions on Google如何在 Actions on Google 中处理异步 API 调用
【发布时间】:2018-12-09 11:12:17
【问题描述】:

我正在使用带有 DialogFlow 的 actions-on-google github nodejs 应用程序。我试图弄清楚如何进行一个耗时超过 5 秒的异步 api 调用,并在响应准备好时将响应返回给用户,考虑到如果未从意图收到响应,google 上的操作将返回 Malformat 错误5 秒内。 这是我的代码的简单代码sn-p:

app.intent('first-intent', async (conv: any) => {
    conv.ask('Please wait while we make our long api call...');
    await myPrivateFunction();
})

// I have put API_RESPONSE_RECEIVED as Events in DialogFlow
app.intent('second-intent', (conv: any) => {
    console.log('This is second-intent');
    var response = conv.data.apiResponse;
    conv.ask(response);
})

function myPrivateFunction(): Promise<void> {
    utils.apiCall().then(apiResponse => {
        console.log('api response received');
        conv.data.apiResponse = apiResponse;
        conv.followup('API_RESPONSE_RECEIVED');
    });
}

在我的 Firebase 日志中,我可以看到“请稍候,我们正在进行长时间的 api 调用...”和“收到 api 响应”,但没有看到“这是第二意图”。如果我在conv.ask('Please wait while we make our long api call...') 之后将conv.followup('API_RESPONSE_RECEIVED') 放在api 调用之外,我会看到“这是第二意图”。所以,app.followup 看起来不错,显然问题在于我如何处理承诺,但我不知道如何解决它。

我在我的开发环境中使用针对 es5 的 TypeScript。所以,我可以在我的 api 调用中使用await/async。但是,使用 await 会导致格式错误,因为 api 调用需要超过 5 秒。

【问题讨论】:

    标签: actions-on-google dialogflow-es


    【解决方案1】:

    我们现在真的没有很好的方法来处理这个问题,但我们有几种方法可以根据您的需要来工作。

    Notifications 目前可用于智能手机上的智能助理,并且它们将用于扬声器。在某些情况下,说您正在解决问题并在收到通知时发送通知,然后从通知中恢复对话可能是有意义的。

    另一种方法是使用Media Response 播放一点“保持音乐”。在这种方案下,您将启动异步调用,但也会立即发回“保持音乐响应”。当长异步调用完成时,它会将结果保存在本地缓存中。在音乐片段结束时,您的 webhook 将收到音乐已完成的通知。如果你在本地缓存中有结果,你可以在那个时候上报,否则你会播放更多的等待音乐并重复这个过程。

    【讨论】:

    • 你有什么例子可以说明“保持音乐”的方法吗?即,在将响应发送给用户并播放音乐之后,它如何返回执行以检查“队列”?...对不起...我对 Google Actions 很陌生,我正在尝试获得一个与我的外部 API 进行通信...它正在工作,但我无法在 API 调用完成后向用户提供响应。
    • 我已更新答案以链接到媒体响应的当前页面,其中包括有关如何处理 MEDIA_STATUS 事件的代码。在此处理程序中,您将检查队列以获取回复。如果您仍然遇到问题,我建议您创建一个新问题,尽可能详细地显示您当前拥有的代码以及它在做什么或没有做什么。
    猜你喜欢
    • 2018-08-05
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多