использовать ожидание внутри обратного вызова (Microsoft Bot Framework v4 nodejs) - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь отправить ответ обратно на chatbot emulator изнутри обратного вызова.

async getUserDetails(step){
    console.log("inside get userdetaiuls modeiule")
    this.userDBObject.password = step.result;

   this.userDBMethod ( async function(response){
        console.log("inside callback return");
        console.log(response);
        await step.context.sendActivity(response); // not able to do this step
        return step.endDialog();
    });
}
async userDBMethod(callback){
request.post('#', 
        {form:{key: 'hi'}}, function (error, response, body) {
        callback("done");
});
}

Я получаю ошибку:

(узел: 17424) UnhandledPromiseRejectionWarning: TypeError: Невозможно выполнить 'get' для прокси, который был отменен в D: \ LCI \ Usecases \ StatementBalance \ lionsbot-src \ bot.js: 384: 32 в Request._callback (D: \ LCI \ Usecases \StatementBalance \ lionsbot-src \ bot.js: 410: 17) в Request.self.callback (D: \ LCI \ Usecases \ StatementBalance \ lionsbot-src \ node_modules \ request \ request.js: 185: 22) в Request.emit(events.js: 182: 13) в Request.EventEmitter.emit (domain.js: 442: 20) в запросе.(D: \ LCI \ Usecases \ StatementBalance \ lionsbot-src \ node_modules \ request \ request.js: 1161: 10) в Request.emit (events.js: 182: 13) в Request.EventEmitter.emit (domain.js:442: 20) на входящем сообщении.(D: \ LCI \ Usecases \ StatementBalance \ lionsbot-src \ node_modules \ request \ request.js: 1083: 12) в Object.onceWrapper (events.js: 273: 13) (узел: 17424) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 1) (узел: 17424) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Так, как я могу использовать await внутри обратного вызова для отправки ответа обратно пользователю.Спасибо!

1 Ответ

0 голосов
/ 06 марта 2019

Я бы рекомендовал использовать Axios - HTTP-клиент на основе обещаний для node.js - вместо пакета запроса.Поскольку Axios основан на обещаниях, вы можете использовать async / await вместо обратных вызовов.Полученный код больше соответствует потоку BotFramework.Для получения дополнительной информации см. Фрагмент кода ниже и документацию Axios .

async getUserDetails(step){
    this.userDBObject.password = step.result;
    try {
        const res = await axios.post('#', {form:{key: 'hi'}});
        await step.context.sendActivity("Done");
    } catch (error) {
        console.log(error);
        await step.context.sendActivity("Sorry, we were not able to complete your request.");
    } 
    return step.endDialog();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...