【问题标题】:use await inside callback (Microsoft Bot Framework v4 nodejs)在回调中使用 await (Microsoft Bot Framework v4 nodejs)
【发布时间】:2019-07-27 19:14:01
【问题描述】:

我正在尝试从内部回调将响应发送回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:不能 在已撤销的代理上执行“获取” 在 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) (node:17424) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误源于在异步函数内部抛出 没有 catch 块,或拒绝未处理的承诺 使用 .catch()。 (拒绝 ID:1)(节点:17424)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。

那么我如何在回调中使用 await 将响应发送回用户。 谢谢!

【问题讨论】:

  • 使用try/catch 捕获Promise 中抛出的错误?
  • 但现在重要的任务是发回用户响应。这是在等待 step.context.sendActivity(response);

标签: javascript node.js botframework chatbot


【解决方案1】:

我会推荐使用Axios——一个基于promise的node.js HTTP客户端——而不是请求包。由于 Axios 是基于 Promise 的,因此您可以使用 async/await 代替回调。生成的代码更符合 BotFramework 的流程。有关详细信息,请参阅下面的代码 sn-p 和 Axios Documentation

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多