2017-01-14 4 views
1

Ich kann keine Lösung finden, warum diese Funktion zurückgibt, bevor mein Nachrichtenarray mit den erforderlichen Werten aktualisiert wird.Probleme mit Node JS verspricht

var calculateDistance = function (message, cLongitude, cLatitude, cSessionID) { 
 
    return new Promise(function (resolve, reject) { 
 

 
    distance.key = options.apiKey; 
 
    distance.units('metric'); 
 

 
    var origins = []; 
 
    origins.push(cLatitude + ',' + cLongitude); 
 

 
    message.forEach(function (obj) { 
 
     obj.sessionId = cSessionID; 
 
     var destinations = []; 
 
     destinations.push(obj.geoLocation.latitude + ',' + obj.geoLocation.longitude); 
 

 
     distance.matrix(origins, destinations, function (err, distances) { 
 
     if (err) { 
 
      return console.log(err); 
 
     } 
 
     if (!distances) { 
 
      return console.log('no distances'); 
 
     } 
 
     if (distances.status == 'OK') { 
 
      for (var i = 0; i < origins.length; i++) { 
 
      for (var j = 0; j < destinations.length; j++) { 
 
       var origin = distances.origin_addresses[i]; 
 
       var destination = distances.destination_addresses[j]; 
 
       if (distances.rows[0].elements[j].status == 'OK') { 
 
       var distance = distances.rows[i].elements[j].distance.text; 
 
       console.log('Distance from ' + origin + ' to ' + destination + ' is ' + distance); 
 
       obj.distance = distance; 
 
       } else { 
 
       console.log(destination + ' is not reachable by land from ' + origin); 
 
       obj.distance = 'N/A'; 
 
       } 
 
      } 
 
      } 
 
     } 
 
     }); 
 

 
    }); 
 

 
    return resolve(message); 
 
    }); 
 
}

Könnte mir jemand darauf hinweisen, was ich falsch hier tue.

Grüße Jimmy

Antwort

0

Dies geschieht, weil Ihr distance.matrix(origins, destinations, callback) asynchron ist. Im obigen Code wird distance.matrix-Methode zur Ereignisschleife gedrängt und setzt ihre Ausführung fort, und bevor diese Methodenrückrufe ausgeführt werden, wird resolve(message) zurückgegeben.

1
var async = require('async'); 
var calculateDistance = function (message, cLongitude, cLatitude, cSessionID) { 
    return new Promise(function (resolve, reject) { 

     distance.key = options.apiKey; 
     distance.units('metric'); 

     var origins = []; 
     origins.push(cLatitude + ',' + cLongitude); 

     async.each(message, function(obj, callback) { 
      obj.sessionId = cSessionID; 
      var destinations = []; 
      destinations.push(obj.geoLocation.latitude + ',' + obj.geoLocation.longitude); 

      distance.matrix(origins, destinations, function (err, distances) { 
      if (err) { 
       callback(err); 
      } 
      if (!distances) { 
       callback('no distances'); 
      } 
      if (distances.status == 'OK') { 
       for (var i = 0; i < origins.length; i++) { 
       for (var j = 0; j < destinations.length; j++) { 
        var origin = distances.origin_addresses[i]; 
        var destination = distances.destination_addresses[j]; 
        if (distances.rows[0].elements[j].status == 'OK') { 
        var distance = distances.rows[i].elements[j].distance.text; 
        console.log('Distance from ' + origin + ' to ' + destination + ' is ' + distance); 
        obj.distance = distance; 
        } else { 
        console.log(destination + ' is not reachable by land from ' + origin); 
        obj.distance = 'N/A'; 
        } 
       } 
       } 
       callback(null); 
      } 
      }); 
      },function(err){ 
      if(err){ 
       return reject(err); 
      }else{ 
       return resolve(message); 
       } 
     }); 
    }); 
}; 
+0

Gibst du immer Entschlossenheit zurück, jedes Mal verrückt .. das ist falsch – Sumeet

+0

Entschuldigung habe die foreach nicht gesehen. Jetzt sollte es in Ordnung sein. –

+0

Hallo und danke wies darauf hin, wo ich falsch dachte. Nur eine Frage. Wo definiere ich die mainCallback-Funktion? –

0

Sie müssen Versprechen lesen. Es sieht für mich so aus, als ob Sie an Versprechungen als magische Möglichkeit denken würden, einen Rückruf einzurichten. "Magie" bedeutet "etwas, das ich nicht verstehen muss". In diesem Fall stimmt das nicht.

Die Executor-Funktion von Ihnen (das ist die Funktion, die mit 'function (resolve, reject)' beginnt) sollte eine asynchrone Anfrage erstellen. Wenn, wie üblich, die Anfrage einen Callback hat, dann setzen Sie die Resolve und Reject im Callback. Das Ergebnis wird ein Zusicherungsobjekt sein, das die Methoden 'then' und 'catch' hat, in denen Ihre Post-Request-Verarbeitung abläuft.

Da Sie eine Matrix mit den Ergebnissen vieler Async-Anfragen füllen möchten, müssen Sie über 'Promise.all' lesen, damit Sie reagieren können, wenn alle von ihnen gelöst haben.

+0

Ich las auf Versprechen und Async. Ich bin ein traditioneller C- und Java-Programmierer, daher hat es eine Weile gedauert, bis ich mich an diese asynch Programmierung gewöhnte. Aber jetzt beginne ich es zu verstehen. Danke, dass Sie mich in die richtige Richtung weisen. –

+0

Wenn Sie mehr lesen möchten, könnten Sie ein kurzes E-Book in Betracht ziehen, das ich geschrieben habe: https://www.amazon.com/Javascript-Promises-Clarified-Adrian-Zimmer-ebook/dp/B01MZ6WYHJ/ –