2017-03-01 7 views
0

Grundsätzlich, was ich tun wollte, ist warten und die ersten beiden Funktionen Ergebnisse erhalten und diesen Wert an die 3. Funktion übergeben. Daher habe ich mit dem Node Q-Modul den folgenden Code ausprobiert.Knoten JS erhalten Werte von mehreren Versprechen

getAddressDetail("", 51.528308, -0.3817812).then(function (pickupLoc) { 
    return pickupLoc.location; 
}).then(function (pickupLocation) { 
    var drop = getAddressDetail(, 51.528308, -0.3817812); 
    return [pickupLocation,drop.location]; 
}) 
.then(function (pickupLocation, dropLocation) { 
    console.log("#####" + pickupLocation +"$$$" + dropLocation) 
}) 
.done(); 

EDIT

function getAddressDetail(location = "", lat, long) { 

    var deferred = Q.defer(); 

    var getLocation = ""; 
    if (location == '' || location == 'undefined') { 

    var url = 'https://maps.googleapis.com/maps/api/geocode/json?key={APIKEY}&latlng=' + lat + ',' + long + '&sensor=false'; 

    request({ 
     url: url, 
     json: true 
    }, function(error, response, body) { 

     if (!error && response.statusCode === 200) { 

     getLocation = body.results[0].formatted_address; 
     deferred.resolve({ 
      'location': getLocation 
     }); 
     //console.log("*******" + getLocation); 
     } 

    }) 
    } else { 
    getLocation = location; 
    deferred.resolve({ 
     'location': getLocation 
    }); 
    } 
    return deferred.promise; 
} 

jedoch nicht dieser Code nicht Wert zurück, der dann Code "Droplocation" in der zweiten definiert, als undefiniert zurück. Siehst du irgendwelche Probleme hier?

Vielen Dank im Voraus.

+0

Gibt 'getAddressDetail' ein Versprechen zurück? –

+0

yep sehen die Bearbeitung. –

+1

Sie warten nicht, dass die zweite 'getAddressDetail' beendet wird, deshalb haben Sie das Problem mit' dropLocation' beginnen 'undefined'. –

Antwort

2

Es gibt ein paar zwielichtige Dinge in Ihrem Code passiert.

  1. return [pickupLocation,drop.location] wil Ergebnis in 1 Parameter (ein Array) in den nächsten Handler, so dass anstelle von .then(function (pickupLocation, dropLocation) {}) sollten Sie .then(function (results) {})

  2. var drop = getAddressDetail(, 51.528308, -0.3817812); verwenden sieht aus wie es kein Versprechen ist, weil Sie sofort die Position bekommen aus dem Ergebnis. (return [pickupLocation,drop.location];) Warum also nicht diesen Wert im nächsten Handler holen?

  3. Wenn getAddressDetail() gibt ein Versprechen, nur ein Array von Versprechen zu verfassen und verwenden Sie die .spread() Operation als das Ergebnis der ersten Versprechen ist nicht erforderlich in der zweiten Versprechen.

Ein Beispiel;

var promiseArray = []; 

promiseArray.push(getAddressDetail("", 51.528308, -0.3817812)); 
promiseArray.push(getAddressDetail("", 51.528308, -0.3817812)); 

Q.spread(promiseArray, function(pickupLocation, drop){ 
    // first parameter (pickupLocation) = result of first promise 
    // second parameter (drop) = result of second promise 
}); 
+0

danke für die Antwort, das, was ich erwarte. Ich bin eigentlich neu Bie to Node. Kann ich wissen, dass, wenn das erste Versprechen fehlschlägt, der Q.spread() Code Block ausgeführt wird? –

+0

Der Ablehnungshandler wird beim ersten Anzeichen eines Fehlers aufgerufen. Das heißt, welche der empfangenen Zusagen zuerst fehlschlägt, wird vom Ablehnungshandler behandelt. –

Verwandte Themen