我在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会导致该格式错误。
答案 0 :(得分:3)
我们目前还没有很好的方法来解决此问题,但是我们有两种方法可以根据您的需求进行分类。
Notifications当前可在智能手机上用于助手,并且将用于扬声器。在某些情况下,可以说您正在解决问题,并在收到通知后发送通知,然后从通知中恢复对话。
另一种方法是使用Media Response播放一些“保持音乐”。在这种方案下,您将启动异步调用,但也会立即发回“保持音乐响应”。长的异步调用完成后,会将结果保存在本地缓存中。在音乐片段的结尾,您的Webhook会通知您音乐已完成。如果您将结果保存在本地缓存中,则可以在那时报告该结果,否则,您将播放更多保留音乐并重复此过程。