3.1 瀑布式對話流程

如果要完成一個動作需要來來回回地問話,那就需要定義一連串的問與答要如何處理,下面這個例子,就是完成一個對話需要詢問使用者的名稱以及他的所在地,在這個對話中,我們先問名稱,待使用者回答之後再問他的所在地,再等使用者回答之後才結束對話。

建立對話

我們可以使用 bot.dialog() 來定義一個對話,然後再由 session.beginDialog() 把使用者帶進某個對話中進行,所以這個機器人可能會長這樣:

...
let bot = new builder.UniversalBot(connector, [
    (session) => {
        session.beginDialog('greeting');
    },
    (session, results) => {
        // greeting 對話結束
    }
]);

bot.dialog('greeting', [
    // 定義對話...
]);

從這段程式碼可以看到,之前的範例都是在建立 UniversalBot 並與 ChatConnector 連接好後,就處理使用者來的訊息,而這裡卻是改用一個陣列放入一連串的函式,這裡定義了一個瀑布式的流程,所以由上而下執行 —— 先把使用者帶進一個名為 greeting 的對話中,待 greeting 這個對話結束後才繼續下一個函式。

於是,我們另外使用了 bot.dialog() 來定義一個對話,名稱識別為 greeting,而後面接的也是一個函式的陣列,用來表示這個對話中來來回回的問與答。

詢問使用者輸入

在 greeting 的對話中,我們會詢問使用者的名稱以及出生地,程式碼會這樣寫:

bot.dialog('greeting', [
    (session, args, next) => {
        session.dialogData.profile = {};
        builder.Prompts.text(session, '請問如何稱呼您?');
    },
    (session, results, next) => {
        if (results.response) {
            session.dialogData.profile.name = results.response;
        }
        builder.Prompts.text(session, '請問您從哪裡來呢?');
    },
    (session, results) => {
        if (results.response) {
            session.dialogData.profile.from = results.response;
        }
        session.endDialogWithResult({ response: session.dialogData.profile });
    }
]);

我們在這個對話中定義了一個有三個函式的陣列,這也是一個瀑布式的流程,所以才會先問名稱才問地點,而 builder.Prompts.text() 會等待使用者輸入一段文字,然後進入到下一個函式進行處理。在這段對話中可以善用 session.dialogData 這個物件來暫存資料。

最後,在結束這個對話時,因為是呼叫 session.endDialogWithResult 函式,所以可以把存放好的資料傳回,再回到呼叫這個對話的流程,並且使用這些資料。

所以一開始的 session 就能進入下一個流程,把結果回應給使用者。

(session) => {
    session.beginDialog('greeting');
},
(session, results) => {
    let profile = results.response;
    session.send('%(name)s您好!%(from)s真是一個好地方!', profile);
}

results matching ""

    No results matching ""