确认 Google 助理的异步操作

Acknowledge an asynchronous action for Google Assistant

我正在为 Google 助手创建一个操作,从 REST API 获取一些数据。该动作发起一个 http 请求,然后解析响应以创建生成的动作语音,所有这些处理都是使用 Promise 异步执行的。因此,在用户获得操作响应之前有一定的时间。

有没有办法像 "ok, I am searching" 那样先说一个确认语句,然后在处理完 http 答案后用第二个语句完成操作?

下面是异步意图的框架:

app.intent('IntentName', (conv, {params}) => {

    // ==> Provide here an acknowledgement to the user <==

    // return a promise to handle this intent asynchronously
    return new Promise(function (resolve, reject) {
        http.get(httpOptions, function (resp) {
            processing...
            conv.close(strSpeech);
        });
    });
});

没有你想象的那么直接,没有。

Google 上的操作和 Dialogflow 以非常对话的方式来回工作。除了一些例外情况,一旦你的 Action 发回回复,你就无法向用户发送任何内容,直到他们向你发回另一个请求。

其中一个例外是您可以通过 Google 助理向您的用户发送 notification。通知仅在某些表面上可用,如果响应将在几秒钟内出现,则不太适合,因此这对您的情况可能不是一个好的解决方案。

更好的方法是立即发回包含 Media Response 的回复,其中包含几秒钟的 "hold music"。当等待音乐正在播放时,您可以让您的代码确定答案并将结果存储在缓存中。在音乐结束时,您的 Action 将再次被调用以指示音频结束。如果届时您有答案,可以return。如果没有,你可以多开几秒的hold音乐。