Material‎ > ‎Software‎ > ‎Angular JS‎ > ‎

Promises

Objetivo

Las promises permiten manejar pedidos asincrónicos de una manera más elegante que el manejo tradicional de callbacks.

Ejemplo

En la página que se muestra el servicio $http ya se vio la sintaxis que utilizan las promises, tomadas del framework $Q de Kris Kowal's. A continuación transcribimos un ejemplo de la página oficial de Angular:

// for the purpose of this example let's assume that variables `$q` and `okToGreet`
// are available in the current lexical scope (they could have been injected or passed in).

function asyncGreet(name) {
  // perform some asynchronous operation, resolve or reject the promise when appropriate.
  return $q(function(resolve, reject) {
    setTimeout(function() {
      if (okToGreet(name)) {
        resolve('Hello, ' + name + '!');
      } else {
        reject('Greeting ' + name + ' is not allowed.');
      }
    }, 1000);
  });
}

var promise = asyncGreet('Robin Hood');
promise.then(function(greeting) {
  alert('Success: ' + greeting);
}, function(reason) {
  alert('Failed: ' + reason);
});
  • API Deferred, en el método asincrónico a ejecutar
    • se construye a partir del objeto $q inyectado en el constructor del componente donde se utilice
    • se pueden disparar básicamente dos eventos
      • resolve: indica que la llamada se completó ok
      • reject: rechaza la llamada y termina invocando el callback por error
  • API Promise, del lado de quien realiza la llamada asincrónica
    • se construye a partir de la instrucción deferred.promise (última línea del método que hace la llamada al server)
    • El cliente hace la llamada a la promesa (método asincrónico) y mediante el mensaje then le indica
      • el primer callback que indica qué debe hacer en caso de completarse exitosamente la promesa
      • y opcionalmente el callback que maneja los errores
Es posible encadenar n promises, lo importante es no olvidar que el último parámetro del mensaje then debe incluir el manejo de error general.

Links relacionados

Comments