通过 NodeJS Google Actions SDK 设置 Google Assistant 应用程序是这样完成的:
似乎这些是同步函数(根据 https://developers.google.com/actions/reference/nodejs/ActionsSdkApp#ActionsSdkApp 上给出的文档
const app = new App({request: req, response: res});
function pickOption (app) {
/*A bunch of steps here*/
}
function optionPicked (app) {
/*Another bunch of steps here*/
}
const actionMap = new Map();
actionMap.set(app.StandardIntents.TEXT, pickOption);
actionMap.set(app.StandardIntents.OPTION, optionPicked);
app.handleRequest(actionMap);
pickOption
和optionPicked
是否可以是异步函数?即,将pickOption
实现为
function pickOption(){
var pickOptionPromise = Q.defer();
pickOptionPromise.resolve({
/*Some results here*/
});
return pickOptionPromise.promise;
}
是的,您大部分时间都会使用两个函数来向助手返回响应。 app.ask
和app.tell
.这些将您的响应包装到JSON对象中,并将其返回给Google。
pickOption
函数和optionPicked
函数可以异步运行,并在逻辑完成后app.tell
运行。
对于初学者来说,根本不需要你使用app.handleRequest()
。(你甚至不需要使用app
,但这不是你的问题。它是一种将意图映射到函数的便捷方法,但您可以通过其他方式自由地执行该任务。我倾向于做这样的事情
function handler1( app ){
// Does the logic asynchronously, but no voice response for some situation.
// Returns a Promise that resolves to an Object about what we did
}
function handler2( app ){
// Does the logic asynchronously, but no voice response for some situation.
// Returns a Promise that resolves to an Object about what we did
}
function chooseHandler( app ){
// Some logic which may be async, but which returns
// a Promise that will resolve to either handler1 or 2
}
function sendResponse( app, handlerResult ){
// Uses the handlerResult object to determine what to
// send back to the user. This may involve async database calls.
// Calls either app.ask(), or app.tell(), or a related call.
// Returns a Promise indicating success
}
chooseHandler( app )
.then( handler => handler( app ) )
.then( result => sendResponse( app, result ) )
.catch( err => {
// Log the error or something
} );
(这是为了说明。它实际上没有经过测试,也不能保证是特定目的的最高质量或最佳设计。
在这种情况下,chooseHandler()
通常是同步的,但如果我们需要做一些事情,比如检查用户以前是否和我们在一起并据此选择不同的处理程序,则可以是异步的。处理程序几乎总是异步的,重要的是它们实际上并没有选择发送回用户的短语 - 这是在sendResponse()
中完成的,并且还可能涉及异步的数据库调用。