Как хранить и получать доступ к переменным разговора из внешнего запроса API в BotKit? - PullRequest
0 голосов
/ 28 июня 2019

Резюме

Я создаю чат-веб-приложение с BotKit (используя API-интерфейс BotkitConversation). Я хочу запросить внешний API, используя входные данные от пользователя, а затем вернуть пользователю некоторые из полученных данных. Я могу сохранить введенные пользователем данные в виде переменной в объекте диалога (используя шаблон {{vars.key}}) и получить доступ к ответу JSON из API и отобразить в консоли, но не в окне чата.

Что я пробовал

Я пытаюсь использовать convo.setVar() для хранения части данных JSON. Я знаю, что вызов API работал, потому что я также console.log это то же значение, и оно, как и ожидалось.

некоторый код

(примечание: такие вещи, как api_key и endpoint хранятся в другом месте, это всего лишь отрывок)

/* The Query Dialog */
let DIALOG_ID = 'my_dialog_1';
let query_dialog = new BotkitConversation(DIALOG_ID, controller);
let total = 0;

query_dialog.ask('What search term would you like to search with?', async(queryTerm, query_dialog, bot) => {

    query_dialog.setVar('queryTerm', queryTerm);

    console.log(`user query is "${ queryTerm }".`);
    console.log(`fetching results from: ${endpoint}?api_key=${api_key}&q=${queryTerm}`);

    fetch(`${endpoint}?api_key=${api_key}&q=${queryTerm}`)
        .then((response) => response.json())
        .then((json) => {
            query_dialog.setVar('total', json.total);
            console.log(`~~total number of results: ${json.total}~~`); // this shows: 2
            // bot.say(`there were {{vars.total}} results`); // this never gets called
            // bot.say(`there were ${total} results`); // this never gets called
            total = json.total;
        })
        // .then((json) => console.log(`~~total number of results: ${json.total}~~`)) // this shows: 2
        // .then((json) => query_dialog.setVar('total', json.total), () => (bot.say(`there were {{vars.total}} results`))) // this doesn't run
        .catch(error => console.log(error))
}, 'queryTerm');

query_dialog.say(`user query is {{vars.queryTerm}}.`); // this works as expected
query_dialog.say(`there were {{vars.total}} results`); // shows "" results
// query_dialog.say(`there were ${total} results`); // says "there were 0 results", which is incorrect, and just pulls from whatever `let total` started with

controller.addDialog(query_dialog);
/* End Dialog */

/* Trigger the dialog */
controller.hears('query', 'message', async(bot, message) => {
    await bot.beginDialog(DIALOG_ID);
});

ожидание против реальности

Как и ожидалось, в окне чата ему повторяется запрос пользователя: «запрос пользователя - {your_query}». Тем не менее, следующая строка отображается «были результаты», что означает, что ничего не сохраняется в vars.total. Фактический результат должен быть числом.

1 Ответ

1 голос
/ 01 июля 2019

Проблема, с которой вы здесь сталкиваетесь, заключается в том, что вызов fetch возвращает обещание, и асинхронная функция-обработчик разрешается немедленно, вместо того, чтобы ждать выборки, чтобы вернуть результаты и установить их в область памяти диалога.

Самый простой способ решить эту проблему - вернуть обещание, чтобы вы могли контролировать его выполнение:

return new Promise(function(resolve, reject) { 

 /// do fetch here
 fetch.then().then().then(resolve)

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...