javascript - sincronas - Solicitudes asincrónicas simultáneas en AngularJS que contienen la operación interna
xmlhttprequest javascript (2)
Aquí hay un plnkr que hace lo que está buscando http://plnkr.co/edit/6WER28?p=preview
function getX() {
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve(''X'');
}, 300)
return deferred.promise;
}
function getY() {
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve(''Y'');
}, 500);
return deferred.promise;
}
var promiseX = getX();
var promiseY = getY();
promiseX.then(function(val) {
console.log(''recevied first one :'' + val);
})
$q.all([promiseX, promiseY]).then(function(valuesFromBothInArray) {
console.log(''received both '' + valuesFromBothInArray);
})
¿Cómo puedo crear 2 solicitudes asíncronas simultáneas en AngularJS que tengan una operación que deba realizarse después de la primera solicitud?
Quiero hacer algo como esto:
- llamar al primer servicio web (recibir x)
- llamar al segundo servicio web (recibir y)
- hacer algo después de recibir una respuesta del primer servicio web (f (x))
- hacer algo después de tener ambos datos (g (x, y))
El siguiente enfoque:
$q.all({
x: $http.get(''http://resourceX''),
y: $http.get(''http://resourceY'')
}).then(function(results) {
$scope.a = f(results.x.data); // where to place this line ?
$scope.z = g(results.x.data, results.y.data);
});
no es eficiente porque está esperando el recursoY incluso si se recibió el recursoX.
Me gustaría llamar a la función f cuando x está disponible y llamar a la función g cuando x e y están disponibles.
Un pseudo-código para lo que quiero se ve así:
$q.all({
x: $http.get(''http://resourceX''),
y: $http.get(''http://resourceY'')
}).when(x is ready) {
$scope.a = f(results.x.data);
}).then(function(results) {
$scope.z = g(results.x.data, results.y.data);
});
Entonces, quiero tener una mezcla de rendimiento entre $ q.todo el enfoque y
$http.get(''http://resourceX'').success(function(x) {
$scope.a = f(x);
$http.get(''http://resourceY'').succes(function(y){
$scope.z = g(x, y);
});
});
Puede separar las llamadas de esta manera:
var promiseX = $http.get(''http://resourceX'');
var promiseY = $http.get(''http://resourceY'');
promiseX.then(function(result {
$scope.a = f(result.data);
});
$q.all({
x: promiseX,
y: promiseY
}).then(function(results) {
$scope.z = g(results.x.data, results.y.data);
});