对话流操作映射的基于承诺的函数



通过 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);

pickOptionoptionPicked是否可以是异步函数?即,将pickOption实现为

function pickOption(){
   var pickOptionPromise = Q.defer();
   pickOptionPromise.resolve({
     /*Some results here*/
   });
   return pickOptionPromise.promise;
}

是的,您大部分时间都会使用两个函数来向助手返回响应。 app.askapp.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()中完成的,并且还可能涉及异步的数据库调用。

最新更新