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:
- ¿Necesito varios vars
$q.defer
? - ¿Es el anterior la mejor manera de esperar que dos llamadas asincrónicas terminen y llenen el objeto de carga útil?
Para sincronizar varias funciones asíncronas y evitar el retorno de llamada de Javascript: http://fdietz.github.io/recipes-with-angular-js/consuming-external-services/deferred-and-promise.html
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