promises promesas example defer array all javascript angularjs promise deferred

javascript - example - promesas angular 4



AngularJS $ q.todos y mĂșltiples $ q.defer (3)

Aunque logré que mi código funcione, hay algo que no entiendo. La siguiente pieza de código funciona correctamente:

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''] }) });

¿Hay una mejor manera de lograr esto? Antes tenía solo una variable diferida, es decir, var var deferred = $q.defer(); pero de esa manera la función .then() devolvió un objeto con el doble de resultados.

Así que las pocas preguntas que tengo son:

  1. ¿Necesito varios vars $q.defer ?
  2. ¿Es el anterior la mejor manera de esperar que dos llamadas asincrónicas terminen y llenen el objeto de carga útil?


Siempre puedes separar tu código en bloques semánticos más pequeños como ese:

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; }

Eso acortará bastante tu llamada en paralelo real ( $q.all ):

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


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''] }); });

lee la promesa de encadenar parte