2016-11-28 63 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