2016-08-01 9 views
0

私は私がで入力してもらうユーザーが名前を変更するために到達したら、Skypeのボットに私のNode.jsの内側にこれにボットは、要求機能へのユーザー入力を渡すために再起動する必要があり

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; 
      } 
}) 
} 

を似ルックスのAPIを持っています検索クエリとは、それが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'); 
     } 
    } 
]); 
私の問題は、これまでのところ、私は戻って私の検索結果を得るにもかかわらず、私が最初にエラーが発生します(第2に回る)ということである

問題が発生した場合、検索変数は保存されますが、関数はjsonの本文を更新しませんクエストが再開されるまで。 bot.dialog('/REName', [の後にこの機能を実行して初めて更新したSearchDetail = bodyを取得するにはどうすればよいですか?

編集:この時点で、URLがユーザーの入力を完了するまでに3回の再起動が必要となり、必要なものが渡されます。

答えて

1

プログラム制御フローを整理するために非同期プログラミング手法を使用します。

操作が完了するまで待ってから(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); 
      }); 

     } 
    } 
]); 
関連する問題