xhr sincronas simultaneously peticiones open multiple ejemplo calls asincronas javascript angularjs asynchronous xmlhttprequest simultaneous

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