2014-03-04 8 views
7

Obwohl ich es geschafft habe, meinen Code funktionieren zu lassen, gibt es etwas, das ich nicht verstehe. Das folgende Stück Code funktioniert richtig:

socket.on('method', function() { 
    var payload = { 
     countrycode: '', 
     device: '' 
    }; 
    var d1 = $q.defer(); 
    var d2 = $q.defer(); 
    $q.all([ 
     geolocation.getLocation().then(function(position) { 
     geolocation.getCountryCode(position).then(function(countryCode){ 
      payload.countrycode = countryCode; 
      d1.resolve(countryCode); 
     }); 
     return d1.promise; 
     }), 
     useragent.getUserAgent().then(function(ua) { 
     useragent.getIcon(ua).then(function(device) { 
      payload.device = device; 
      d2.resolve(device); 
     }); 
     return d2.promise 
     }) 
    ]).then(function(data){ 
     console.log(data); //displays ['value1', 'value2'] 
    }) 
    }); 

Gibt es einen besseren Weg, dies zu erreichen? Zuvor hatte ich nur eine verzögerte Variable, d. H. Var var deferred = $q.defer();, aber auf diese Weise gab die -Funktion ein Objekt mit dem doppelten Ergebnis zurück.

So die wenige Frage, die ich habe, ist:

  1. Benötige ich mehr $q.defer Vars?
  2. Ist der obige Weg der beste Weg, um auf zwei asynchrone Aufrufe zu warten, um das Nutzlastobjekt zu beenden und aufzufüllen?

Antwort

6
socket.on('method', function() { 
    var payload = { 
     countrycode: '', 
     device: '' 
    }; 
    geolocation.getLocation() 
    .then(function(position) { 
     return geolocation.getCountryCode(position); 
    }) 
    .then(function(countryCode) { 
     payload.countrycode = countryCode; 
     return useragent.getUserAgent(); 
    }) 
    .then(function(ua) { 
     return useragent.getIcon(ua); 
    }) 
    .then(function(device) { 
     payload.device = device; 
     console.log(data); //displays ['value1', 'value2'] 
    }); 
}); 

read das Versprechen Verkettungs Teil

+0

Das ist eine wirklich gute Antwort +1 – maurycy

+0

Dank Wayne ist - ich eine leichte bearbeitet (console.log (Payload);) – Tamas

6

Sie Ihren Code immer in kleinere semantische Blöcke wie so trennen könnten:

getCountryCode = function() { 
    var d = $q.defer(); 
    geolocation.getLocation() 
    .then(function(position) { 
    return geolocation.getCountryCode(position) 
    }) 
    .then(function(countryCode) { 
    d.resolve(countryCode); 
    }) 
    .fail(function(err) { 
    d.reject(err); 
    }) 
    return d.promise; 
}; 

getDevice = function() { 
    var d = $q.defer(); 
    useragent.getUserAgent() 
    .then(function(ua) { 
    return useragent.getIcon(ua) 
    }) 
    .then(function(device) { 
    d.resolve(device); 
    }) 
    .fail(function(err) { 
    d.reject(err); 
    }); 
    return d.promise; 
} 

Die Ihr tatsächlichen Parallelruf verkürzen ($q.all) ein ganz bit:

socket.on('method', function() { 
    $q.all([getCountryCode(), getDevice()]) 
    .spread(function(countryCode, device) { 
     var payload = { 
     countryCode: countryCode, 
     device: device 
     }; 
     // ... do something with that payload ... 
    }); 
}); 
+0

ich auch diese Lösung gefällt - Danke Tharabas. – Tamas

+0

Gern geschehen;) – Tharabas

Verwandte Themen