2016-11-28 3 views
1

Ich erstelle Projekt mit Javascript und Nodejs. Ich integriere Callback in meine Funktion innerhalb der Schleife mit Bedingungsbasis, bin aber nicht in der Lage, dies zu tun. Mein Problem ist Callback ist bei der ersten Wiederholung der Schleife abgeschlossen. hier ist mein Code:Verwenden Sie Callback mit 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; 
           } 

          }) 
         } 
        } 
       } 
      } 
     } 

    }) 
} 

Hier ist der Funktionsaufruf:

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

Code-Formatierung mein Gehirn bluten macht, wenn ich versuche, es zu lesen –

+1

Ich glaube, Sie Rückruf in beide if/else Bedingung verwenden. –

+0

Was meinst du mit 'var url = url;'? –

Antwort

0

Wenn Sie asynchrone Verfahren zur Schleife in einem mit Callback ausgeführt wird, denken Sie daran, dass der Rückruf von Angerufenen im ersten gefeuert werden Ereignis in der Schleife abgeschlossen. In Ihrem Fall request lib Anruf ist ein asynchroner Prozess innerhalb von for-Schleife, müssen Sie alle Rückruf von allen Anrufen verarbeiten, bevor Sie den Angerufenen zurückrufen möchten.

Bitte lesen: How to write asynchronous functions for Node.js

0

Vielleicht ist es Zeit für Sie Javascript Promise verwenden zu beginnen.

+0

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

0

Die Bibliothek async für Node unterstützt Sie bei dieser Art von Aufgaben.

Verwenden Sie asynchrone Wasserfall .It Führt ein Array von Funktionen in Serie, jedes übergibt ihre Ergebnisse an die nächste im Array. Wenn jedoch eine der Funktionen einen Fehler an den Rückruf übergibt, wird die nächste Funktion nicht ausgeführt und der Haupt-Rückruf wird sofort mit dem Fehler aufgerufen.

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

Verwandte Themen