javascript - 机器人必须重新启动才能将用户输入传递给请求功能

标签 javascript node.js botframework

我的 Node.js Skype Bot 中有一个看起来与此类似的 api

var SearchName = '',
TaxBillNu = ''
_rows = '10',
SearchDetail;

function getMobileData (Name, TaxBill, Rows) {
url = "http://example.com/api/search/OwnerName="+Name+"&TaxBill="+TaxBill+"&Rows="+Rows;
request({
    url: url,
    json: true
}, function (error, response, body) {
        if (!error && response.statusCode === 200) {
         SearchDetail = body; 
        }else{
            session.beginDialog('/');

            err = error;
          }
})
}

用户进入 REName 后,我会要求他们输入搜索查询,然后使用 API 转到搜索结果列表

bot.dialog('/REName', [
    function (session) {
        builder.Prompts.text(session, "Type a search query..");
    },
    function (session, results) {
        if (results.response) {
            SearchName = results.response;
            getMobileData(SearchName, TaxBillNu, _rows)
            if(err){
            session.send(err);
            }
            session.beginDialog('/REList');
        }
    }
]);

到目前为止,我的问题是,即使我返回搜索结果(在第二次循环时),我首先会收到一个错误,表明发生了问题,搜索变量已保存,但该函数不会更新正文json 请求直到它重新启动之后。如何确保我可以在 bot.dialog('/REName', [) 之后运行该函数并第一次获取更新的 SearchDetail = body

编辑:此时需要重新启动 3 次才能完成 URL 的用户输入并向我传递我需要的内容。

最佳答案

使用异步编程技术来组织程序控制流。

由于您需要等待操作完成(REST API 请求),然后将该数据传递到下一步,因此您已经获得了 async.waterfall() 的完美用例。控制流模式。

例如,使用 Node.js 模块 async ,在对话框处理程序中构造一个 async.waterfall ,如下所示:

var async = require('async');

bot.dialog('/REName', [
    function (session) {
        builder.Prompts.text(session, "Type a search query..");
    },
    function (session, results) {
        if (results.response) {
            SearchName = results.response;
            // do async stuff here
            async.waterfall([
                function(callback) {
                    // modify your getMobileData() method so it returns desired result
                    var mobileData = getMobileData(SearchName, TaxBillNu, _rows);
                    callback(null, mobileData);
                },
               function(mobileData, callback) {
                   // mobileData gets passed from the previous function
                   // then call session beginDialog
                   session.beginDialog('/REList');
                   callback(null);
               }
           ], function (err, result) {
               // handle errors here
               session.send(err);
           });

        }
    }
]);

关于javascript - 机器人必须重新启动才能将用户输入传递给请求功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38703863/

相关文章:

javascript - 尝试使用 JSON 解析字符串数组时出现奇怪的错误

javascript - 测试模块的未导出 Node 方法

javascript - php 标识符中的转义无效

javascript - Meteor 0.8.x 命名空间

node.js - Azure 函数的 Node 和 DirectlineJS es6 导出的版本兼容性问题

javascript - 检查包含数组的数组

node.js - 最简单的 nodejs 回显服务器

javascript - Node.js curl : (55) Send failure: Broken pipe error

c# - 适用于专用应用程序的 Microsoft BotFramework

c# - 将机器人部署到 Azure 后,在 Web 聊天中测试键入消息返回 "Not found"HTTP 状态代码