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