首页 > 解决方案 > 在 bot 框架中处理异步调用

问题描述

我们正在使用通过用 NodeJS 编写的 Microsoft Bot Framework 配置的 Bot。在对话的执行流程中,我们向用户提供某些信息,然后通过 SOAP 完成一些服务器处理,并且在下一个瀑布方法开始之前需要此 SOAP 响应的结果。

简而言之,我们有以下代码:

bot.dialog('changedefaultlogingroupDialog', [
    async function (session, args, next) {
        wargs[0] = 'change default login group';

        var sourceFile = require('./fetchSharePointUserDetail.js');
        session.privateConversationData.userSharepointEmail = global.DEVSharepointBotRequestorEmailID;
        console.log('\nsession.privateConversationData.userSharepointEmail:'+session.privateConversationData.userSharepointEmail);
        var get_SharepointUserId_args = ['get Sharepoint user id', session.privateConversationData.userSharepointEmail];
        sourceFile.login(get_SharepointUserId_args);

            setTimeout(() => {
                global.DEVSharepointTeamcenterUserID = require('./fetchSharePointUserDetail.js').DEVTeamcenterUserId;
                  console.log('\nglobal.DEVSharepointTeamcenterUserID:'+global.DEVSharepointTeamcenterUserID+'\n');
                  console.log("Request has been made from directline channel by user id <"+global.DEVSharepointTeamcenterUserID+">");
                  session.privateConversationData.requestor_id =  global.DEVSharepointTeamcenterUserID; 
                  session.privateConversationData.create_ques  = session.message.text;
                  next();
              }, 3000);
    },

async function (session, result, next) {

    Do processing here that is dependent on session.privateConversationData.requestor_id

}

从上面的示例可以看出,setTimeout 方法等待 3 秒以检索 SOAP 响应。虽然这在 DEV 环境中有效,但在我们的 PRD 环境中却失败了。所以我想知道更合适的方法是什么。在这种情况下使用“等待”是否正确?我问这个是因为这是在 BOT 框架上下文中,并且不确定这是否有任何副作用。

请建议。

谢谢,帕万。

标签: node.js

解决方案


Await 是看待这个问题的正确方法。

我不熟悉 bot 框架,但我猜测它们的代码的异步部分发生在登录期间。

await sourceFile.login(get_SharepointUserId_args);

将是异步调用的位置。它也可能在fetchSharePointUserDetail.js 有可能有更好的方法将该文件作为模块加载,这样您就可以在返回的对象上调用函数,而不是从一些显然正在执行某事的代码中返回变量。


推荐阅读