2016-11-28 8 views
1

私はjavascriptとnodejsを使用してプロジェクトを作成しています。私は条件ベースでループ内の私の関数内でコールバックを統合していますが、this.myの問題を解決できません。コールバックはループの最初の反復で完了しています。ここに私のコードは次のとおりです。ここでjavascriptでコールバックを使用

function tagEndpointNames(callback) { 

    var data = userGenerateToken(); 
    var sql = "SELECT * FROM topology_data WHERE topology_coordinates !='' and topology_uuid is not null" 

    var query = conn.query(sql, function(err, tagEndpointNames) { 

     for (var i = 0; i < tagEndpointNames.length; i++) { 
      var topologytagData = { 
       "topology_tag": tagEndpointNames[i].topology_uuid 
      } 

      var tpCooridinates = JSON.parse(tagEndpointNames[i].topology_coordinates); 

      for (var j = 0; j < tpCooridinates.stageObjects.length; j++) { 

       if (tpCooridinates.stageObjects.length) { 

        if (tpCooridinates.stageObjects[j].endPointId) { 

         if (isGuid(tpCooridinates.stageObjects[j].endPointId)) { 

          var endPointUUID = tpCooridinates.stageObjects[j].endPointId; 
          var _ro = require('request'); 

          var url = url; 

          var _d = ''; 

          _ro({ 
           url: url, 
           method: 'POST', 
           headers: { 
            'Content-Type': 'application/json', 
            'Authorization': 'Bearer ' + data['access_token'] 
           }, 

           json: topologytagData 

          }, function(_e, _r, _b) { 

           if (_r.statusCode == 200 && !_e) { 

            callback() 
             //return; 
           } else { 

            callback() 
            console.log("andarss") 
            return; 
           } 

          }) 
         } 
        } 
       } 
      } 
     } 

    }) 
} 

は、関数呼び出しは次のとおりです。

tagEndpointNames(function(){ 
      console.log ('Server Closed during MIGRATION JOB 4'); 
      server.close(function() { 
       process.exit(0); 
      }); 
     }) 
+2

あなたのコードの書式設定が、私はそれを –

+1

を読むしようとしたとき、私はあなたが両方のif/else条件でコールバックを使用していると思う私の脳の出血になります。 –

+0

'var url = url;'はどういう意味ですか? –

答えて

0

あなたがのためのループでコールバックで非同期プロセスを実行している場合は、呼び出し先からのコールバックが最初に解雇されることを覚えておいてくださいループ内でイベントが完了しました。あなたのケースでは、request libコールはforループ内の非同期プロセスです。呼び出し先をコールバックする前に、すべての要求呼び出しからすべてのコールバックを処理する必要があります。

お読みください: How to write asynchronous functions for Node.js

0

多分それはあなたがJavascript Promiseの使用を開始するための時間です。

+0

または[async](http://caolan.github.io/async/docs.html) – emaniacs

0

ノード用ライブラリasyncは、この種のタスクを実行するのに役立ちます。

async waterfall .It一連の関数を直列に実行し、それぞれの結果を配列の次のものに渡します。ただし、いずれかの関数がコールバックにエラーを渡すと、次の関数は実行されず、メインのコールバックがエラーとともにただちに呼び出されます。

JS

var create = function (req, res) { 
    async.waterfall([ 
     _function1(req), 
     _function2, 
     _function3 
    ], function (error, success) { 
     if (error) { alert('Something is wrong!'); } 
     return alert('Done!'); 
    }); 
}; 

function _function1 (req) { 
    return function (callback) { 
     var something = req.body; 
     callback (null, something); 
    } 
} 

function _function2 (something, callback) { 
    return function (callback) { 
     var somethingelse = function() { // do something here }; 
     callback (err, somethingelse); 
    } 
} 

function _function3 (something, callback) { 
    return function (callback) { 
     var somethingmore = function() { // do something here }; 
     callback (err, somethingmore); 
    } 
} 

Reference

関連する問題