【问题标题】:How to wait for one function to execute before executing second function in microsoft bot framework?如何在执行 microsoft bot 框架中的第二个函数之前等待一个函数执行?
【发布时间】:2017-02-06 10:04:40
【问题描述】:

我正在调用一个处理用户输入消息的函数,然后在 microsoft bot 框架的 node.js SDK 中相应地发送响应。这是场景:当机器人收到用户的消息时,我正在调用一个函数processMessage,这需要一些时间来执行。 processedResultprocessMessage 执行后得到的结果。由于机器人过早响应,它正在发送一个未定义的值。如何确保在processMessage 执行完成之前不执行瀑布中的下一步?这是我的代码:

var connector = new builder.ConsoleConnector().listen();
var bot = new builder.UniversalBot(connector);

bot.dialog('/', [
    function (session) {
        console.log('step1')
        processMessage(session.message.text);
    },
    function(session) {
        console.log('step3')
        session.send(processedResult);
    }
]);

console.log('step2')processMessage 的定义中。日志的顺序是step1、step3、step2。

【问题讨论】:

  • processMessage 是否接受回调?
  • 没有。但如果回调有帮助,我会添加它。如果有的话,请使用回调解释解决方案。

标签: javascript node.js botframework


【解决方案1】:

您的 processMessage 函数需要返回一个 Promise。的,你可以在那里做一个.then来做第3步的日志。

类似以下内容(我在这里写了代码,所以它可能包含一些小错误)

function processMessage(text) {
 return new Promise(resolve, reject) => {
    console.log(text);
    var processedResult = 'myProcessedResult';
    resolve(processedResult);
 }
}

bot.dialog('/', [
    function (session) {
        console.log('step1')
        processMessage(session.message.text).then(processedResult) => {
         console.log('step3')
         session.send(processedResult);
    }
]);

Promises 是Node.js/Javascript 世界中的常见模式。您可能想了解它们,例如here

this sample 中,您可以看到如何使用这种方法:the callerfunction returning a Promise

【讨论】:

    【解决方案2】:

    回调 DP 的替代方案(您可以在回调返回时调用 next 或 prompt):

    var processMessage = (callback) => {
        request('...', (a, b, b) => {
           callback(null, 'ok');
        });
    }
    
    bot.dialog('/', [
        function (session, next) {
            console.log('step1')
            processMessage(session.message.text, (err, result) => {
                session.send(result);
                next();
            });
        },
        function(session, next) {
            console.log('step3')
            processMessage(session.message.text, (err, result) => {
                builder.Prompts.confirm(session, result);
            });
        }
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多