2017-11-15 3 views
1

einen Google-Assistenten App über den NodeJS Google Aktionen SDK einrichten werden so gemacht:Versprechen basierte Funktionen für dialogflow-Aktion Karte

Es scheint, dass diese synchronen Funktionen sind (gemäß der angegebenen Dokumentation über 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); 

Ist es möglich, für pickOption und optionPicked asynchrone Funktionen zu sein? also wäre es richtig zu haben pickOption als

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

Antwort

1

Ja, es gibt zwei Funktionen, die Sie am häufigsten verwenden, um eine Antwort an den Assistenten zu senden. app.ask und app.tell. Diese wickeln Ihre Antwort in ein JSON-Objekt ein und senden es an Google zurück.

Ihre pickOption und optionPicked Funktionen können asynchron ausgeführt werden und app.tell ausführen, nachdem Ihre Logik abgeschlossen ist.

1

Für den Anfang, gibt es keine Voraussetzung, dass Sie app.handleRequest() überhaupt verwenden. (Sie müssen nicht einmal app verwenden, aber das ist nicht Ihre Frage.) Es ist dort als eine bequeme Methode, Intents Funktionen zuzuordnen, aber Sie können diese Aufgabe auf andere Weise tun. Ich neige dazu, Dinge zu tun, wie

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 
    }); 

(Dies soll beispielhaft sein. Es ist nicht wirklich getestet, noch garantiert die höchste Qualität oder das beste Design für einen bestimmten Zweck.)

In dieser Die chooseHandler() ist normalerweise synchron, könnte aber asynchron sein, wenn wir Dinge überprüfen müssen, z. B. prüfen, ob der Benutzer schon einmal bei uns war, und auf dieser Grundlage einen anderen Handler auswählen. Die Handler sind fast immer async, und das wichtige ist, dass sie nicht wirklich die Phrasen auswählen, die an den Benutzer zurückgeschickt werden - das geschieht in sendResponse() und kann auch einen Datenbankaufruf beinhalten, der asynchron ist.

Verwandte Themen