tutorial - promise angularjs




Cadena Angular $ llamadas http correctamente? (2)

He estado leyendo sobre $ q y promesas desde hace días y parece que lo entiendo ... algo. Tengo la siguiente situación en la práctica:

  1. Se realiza una solicitud de $ http y verifica si se puede hacer una llamada posterior.
  2. Si la primera llamada falla, devuelva "sin datos", si tiene éxito y dice que se puede hacer una llamada, se hace la segunda llamada, si no, "no hay datos" de nuevo. Si la segunda llamada tiene éxito, devuelve datos, si no, "no hay datos". Se parece a esto (aproximadamente, lo simplifiqué para una idea general, así que no te preocupes por los errores menores aquí):

            return $http.get (something)
                .then(function(allowedAccess){
                    if(allowedAccess){
                        return $http.get (somethingElse)
                            .then( function(result){return {data:result} },
                            function(error){return {data:"n0pe"} }
                        )
                    } else {
                        return {data:"n0pe"}
                    }
                },
                function(){ return {data:"n0pe"} });

Me dijeron que usara $ q aquí. Realmente no entiendo cómo o por qué lo haría. Las llamadas $ http ya son promesas.

Si hay una manera de hacer esto más limpio, no lo veo. Acabo de hacer releer este post sobre el tema . Esencialmente, ¿me estoy perdiendo algo / hay una mejor manera de hacer esto?

Edición: También, solo releer un tutorial sobre promesas de encadenamiento - no maneja en absoluto las fallas de llamadas. Básicamente publicando esto como due diligence.

Edición 2: Esto es más un elaborado sobre la teoría sobre la que estoy preguntando, extracto del primer artículo:

Sin embargo, este es un ejemplo simple. Se vuelve realmente poderoso si tu devolución de llamada then () devuelve otra promesa. En ese caso, el próximo then () solo se ejecutará una vez que se resuelva la promesa. Este patrón se puede usar para solicitudes HTTP en serie, por ejemplo (donde una solicitud depende del resultado de una anterior):

Esto parece estar hablando de cadenas como esta:

   asyncFn1(1)
    .then(function(data){return asyncFn2(data)})
    .then(function(data){return asyncFn3(data)})

Entonces, si entiendo correctamente esto a). No se aplica a mí porque no tengo una tercera función. segundo). Se aplicaría a mí si tuviera tres funciones porque mientras ejecuto una instrucción if dentro de la primera solicitud de $ http, y solo dentro de la declaración if, devuelvo otra promesa. Entonces, teóricamente, si tuviera tres funciones asíncronas para encadenar, ¿necesitaría poner mi declaración if dentro de una promesa?


$ q ayudará a reducir la pirámide de llamadas como esta:

async-call1.then(...
  aysnc-call2.then(...

Esta publicación del blog, http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/ , ofrece una forma limpia de realizar múltiples solicitudes HTTP. Note el enfoque más limpio usando $ q. En caso de que estuvieras en un solo punto final HTTP, el uso de tu método hubiera estado bien. Yo diría, lo que tienes está bien también; $ q podría permitir una mayor flexibilidad en el futuro.

La publicación del blog describe un servicio mientras se usa $ qy el código parece más limpio.

service('asyncService', function($http, $q) {
  return {
    loadDataFromUrls: function(urls) {
      var deferred = $q.defer();
      var urlCalls = [];
      angular.forEach(urls, function(url) {
        urlCalls.push($http.get(url.url));
      });
      // they may, in fact, all be done, but this
      // executes the callbacks in then, once they are
      // completely finished.
      $q.all(urlCalls)
      .then(...

Soy un principiante con promesas también, así que toma esto con un grano de sal.


Así es como codificaría este tipo de problema:

// returns a promise that resolves some endpoint if allowed
function getDataWithAccess(allowed){
    return allowed ? $http.get(someEndpoint) : $q.reject();
}

// do something with data
function handleData(data){
    // do stuff with your data
}

// main chain
$http.get(accessCredEndpoint)
    .then(getDataWithAccess)
    .then(handleData)
    .catch(function(err){
        return { data: "n0pe" };
    });

Sí, esto se parece mucho a la respuesta de New Dev, sin embargo, quería hacer un punto de extraer las funciones en sus propios bloques. Esto hace que el código general sea mucho más legible.





angular-promise