如何在Google Actions中处理异步API调用

时间:2018-06-30 13:55:56

标签: actions-on-google dialogflow

我在DialogFlow上使用“ google-actions-on-google github nodejs”应用程序。我正在尝试弄清楚如何进行耗时超过5秒的异步api调用,并在响应准备就绪时将响应返回给用户,考虑到Google上的操作会返回错误格式错误(如果未从意图中接收到响应)在5秒内。 这是我的代码的一个简单代码段:

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.followup('API_RESPONSE_RECEIVED')放在conv.ask('Please wait while we make our long api call...')之后的api调用之外,则会看到“这是第二意图”。因此,app.followup看起来还可以,显然问题出在我如何处理承诺,但我不知道如何解决它。

我在开发环境中使用针对es5的TypeScript。因此,我可以在API调用中使用await/async。但是,由于api调用花费的时间超过5秒,因此使用await会导致该格式错误。

1 个答案:

答案 0 :(得分:3)

我们目前还没有很好的方法来解决此问题,但是我们有两种方法可以根据您的需求进行分类。

Notifications当前可在智能手机上用于助手,并且将用于扬声器。在某些情况下,可以说您正在解决问题,并在收到通知后发送通知,然后从通知中恢复对话。

另一种方法是使用Media Response播放一些“保持音乐”。在这种方案下,您将启动异步调用,但也会立即发回“保持音乐响应”。长的异步调用完成后,会将结果保存在本地缓存中。在音乐片段的结尾,您的Webhook会通知您音乐已完成。如果您将结果保存在本地缓存中,则可以在那时报告该结果,否则,您将播放更多保留音乐并重复此过程。