2016-11-28 99 views
1

我使用javascript和nodejs創建項目。我在我的函數裏面爲循環集成了回調函數,但是我無法做到這一點。我的問題是回調在循環的第一次迭代完成。這裏是我的代碼:使用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

當您正在運行的異步過程與回調在for循環中,請記住,從被叫回調將在第一被解僱事件在循環內完成。你的情況request lib call是一個for循環內部的異步進程,你需要處理所有請求調用的所有回調,然後才能回調被調用者。

請閱讀: How to write asynchronous functions for Node.js

0

Node的async庫將幫助您完成這類任務。

使用異步瀑布。它運行一系列函數,每個函數都將結果傳遞給數組中的下一個。但是,如果任何函數向回調傳遞錯誤,則不執行下一個函數,並立即調用主回調並返回錯誤。

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