node.js - 在 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 框架上下文中,并且不确定这是否有任何副作用。
请建议。
谢谢,帕万。
解决方案
Await 是看待这个问题的正确方法。
我不熟悉 bot 框架,但我猜测它们的代码的异步部分发生在登录期间。
await sourceFile.login(get_SharepointUserId_args);
将是异步调用的位置。它也可能在fetchSharePointUserDetail.js
有可能有更好的方法将该文件作为模块加载,这样您就可以在返回的对象上调用函数,而不是从一些显然正在执行某事的代码中返回变量。
推荐阅读
- java - requestWindowFeature(Window.FEATURE_NO_TITLE) 问题
- java - 如何在我的活动中实现“不再显示”功能?
- python - 在 Kubernetes 上创建 HTTPS 端点最简单的方法是什么?
- c++ - 在 GStreamer 管道总线上调用 gst_bus_set_sync_handler 是否安全?
- r - 在R中组合具有相似名称的嵌套列表项
- machine-learning - Keras 中的 RGB 图像是表示为 [R,G,B], [R,G,B], ... 还是表示为 [RR.., GG.., BB..]?
- project-reactor - flatMap vs map,基本解释没问题,但是当我的转换函数本身不同步时会发生什么?
- java - 我可以在 arduino 硬件上运行 java 代码(不使用端口通信)吗?
- jquery - jquery - 替换背景网址不包含大小
- jenkins - 通过詹金斯运行时,不会在gitlab上删除csv文件中的一行