Bot必须重新启动才能将用户输入传递给请求函数

Bot has to restart to pass user input to request function

本文关键字:输入 函数 请求 用户 重新启动 Bot      更新时间:2023-09-26

我的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请求的Body。如何确保我可以在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);
           });
        }
    }
]);