Muestra las diferencias entre dos versiones de la página.
unidades:06_promesas:02_q [2014/08/30 11:22] admin |
unidades:06_promesas:02_q [2014/09/01 23:53] (actual) admin |
||
---|---|---|---|
Línea 2: | Línea 2: | ||
El servicio de [[https://docs.angularjs.org/api/ng/service/$q|$q]] es un servicio de AngularJS que contiene toda la funcionalidad de las promesas. Tal y como se indica en su documentación, está basado en la implementación de [[http://documentup.com/kriskowal/q|Kris Kowal's Q.]]. AngularJS ha hecho su propia versión para que esté todo integrado en el propio framework. | El servicio de [[https://docs.angularjs.org/api/ng/service/$q|$q]] es un servicio de AngularJS que contiene toda la funcionalidad de las promesas. Tal y como se indica en su documentación, está basado en la implementación de [[http://documentup.com/kriskowal/q|Kris Kowal's Q.]]. AngularJS ha hecho su propia versión para que esté todo integrado en el propio framework. | ||
- | El sistema de promesas yo lo suelo comparar al [[http://es.wikipedia.org/wiki/Problema_Productor-Consumidor|problema del productor-consumidor]]. La similitud es en que hay una parte que generará la información , por ejemplo el método ''$http'' y otra parte que consumirá la información, por ejemplo nuestro código. Esta separación es importante ya que hay 2 objetos con los que tendremos que tratar. | + | Yo suelo comparar el sistema de promesas al [[http://es.wikipedia.org/wiki/Problema_Productor-Consumidor|problema del productor-consumidor]]. La similitud es que hay una parte que generará la información , por ejemplo el método ''$http'' y otra parte que consumirá la información, por ejemplo nuestro código. Esta separación es importante ya que hay 2 objetos con los que tendremos que tratar. |
- | En la nomenclatura de AngularJS al productor se le llama ''defered'' y al consumidor se le llama ''promise''. Mediante el servicio de ''$q'' obtenemos el objeto ''defered'' llamando el método ''defer()'' y a partir de él obtenemos el objeto ''promise'' llamando a la propiedad ''promise'' | + | En la nomenclatura de AngularJS al productor se le llama ''defered'' y al consumidor se le llama ''promise''. Mediante el servicio de ''$q'' obtenemos el objeto ''defered'' llamando el método ''defer()'' y a partir de él obtenemos el objeto ''promise'' llamando a la propiedad ''promise''. |
En el siguiente diagrama UML podemos ver las distintas clases que forman parte de las promesas: | En el siguiente diagrama UML podemos ver las distintas clases que forman parte de las promesas: | ||
Línea 42: | Línea 42: | ||
- | Una vez creada mediante el método ''defer()'', una promesase puede encontrar en alguno de los siguiente 3 estados: | + | Una vez creada mediante el método ''defer()'', una promesa se puede encontrar en alguno de los siguiente 3 estados: |
<uml> | <uml> | ||
Línea 80: | Línea 80: | ||
Ya tenemos los 2 objetos preparados y listos para ser usados. Ahora explicaremos más sobre cada uno de ellos. | Ya tenemos los 2 objetos preparados y listos para ser usados. Ahora explicaremos más sobre cada uno de ellos. | ||
===== defered ===== | ===== defered ===== | ||
- | El objeto ''defered'' sólo se usa desde dentro de la función asíncrona, por lo tanto el que llama a ''sumaAsincrona'' no sabe nada del objeto ''defered''. Como ya hemos dicho, el objeto ''defered'' hará las funciones de productor de la información ((aunque realmente no la produce sino que sólo notifica si se ha producido o no)) | + | El objeto ''defered'' sólo se usa desde dentro de la función asíncrona, por lo tanto el que llama a ''sumaAsincrona'' no sabe nada del objeto ''defered''. Como ya hemos dicho, el objeto ''defered'' hará las funciones de productor de la información ((aunque realmente no la produce sino que sólo notifica si se ha producido o no)). |
Este objeto tiene 2 métodos. Uno de ellos para indicar que se ha obtenido la información y por lo tanto hacer que la promesa pase al estado "Resuelto" y un segundo método para indicar que algo ha fallado y que no se ha podido obtener la información y por lo tanto hacer que la promesa pase al estado "Rechazado". | Este objeto tiene 2 métodos. Uno de ellos para indicar que se ha obtenido la información y por lo tanto hacer que la promesa pase al estado "Resuelto" y un segundo método para indicar que algo ha fallado y que no se ha podido obtener la información y por lo tanto hacer que la promesa pase al estado "Rechazado". | ||
^ Método ^ Parámetros ^ Descripción ^ | ^ Método ^ Parámetros ^ Descripción ^ | ||
- | | ''resolve '' | ''resolve(resultado)'' | Llamaremos a este método para indicar que ya tenemos la información que se solicitó y por lo tanto que la promesa está resuelta. Siendo el parámetro ''resultado'' el que contiene la información solicitada. | | + | | ''resolve '' | ''resolve(resultado)'' | Llamaremos a este método para indicar que ya tenemos la información que se solicitó y por lo tanto que la promesa está resuelta, siendo el parámetro ''resultado'' el que contiene la información solicitada. | |
- | | ''reject'' | ''reject(error)'' | Llamaremos a este método para indicar que no ha sido posible obtener la información que se solicitó y por lo tanto que la promesa está rechazada. Conteniendo el parámetro ''error'' información relativa a la naturaleza del error. | | + | | ''reject'' | ''reject(error)'' | Llamaremos a este método para indicar que no ha sido posible obtener la información que se solicitó y por lo tanto que la promesa está rechazada, conteniendo el parámetro ''error'' información relativa a la naturaleza del error. | |
<note tip> | <note tip> | ||
Línea 118: | Línea 118: | ||
* Línea 10: Si algo ha fallado lo indicamos llamando a ''reject''. En este caso pasamos como valor de retorno la propia excepción que se ha generado. | * Línea 10: Si algo ha fallado lo indicamos llamando a ''reject''. En este caso pasamos como valor de retorno la propia excepción que se ha generado. | ||
===== promise ===== | ===== promise ===== | ||
- | Acabamos de ver lo que hay que hacer internamente para producir la información en la función ''sumaAsincrona''. Ahora pasemos al otro lado del problema. Veamos lo que ocurre al llamar a nuestra función asíncrona, es decir en la parte del consumidor. | + | Acabamos de ver lo que hay que hacer internamente para producir la información en la función ''sumaAsincrona''. Ahora pasemos al otro lado del problema. Veamos qué ocurre al llamar a nuestra función asíncrona, es decir en la parte del consumidor. |
Lo primero que debemos hacer es llamar a la función asíncrona y guardarnos la promesa que nos retorna. | Lo primero que debemos hacer es llamar a la función asíncrona y guardarnos la promesa que nos retorna. | ||
Línea 193: | Línea 193: | ||
<note tip> | <note tip> | ||
- | Normalmente para abreviar en vez de guardarnos la variable de la promesa y luego llamar al método ''then'' se suele hacer todo junto de la siguiente manera: | + | Normalmente, para abreviar, en vez de guardarnos la variable de la promesa y luego llamar al método ''then'' se suele hacer todo junto de la siguiente manera: |
<sxh js> | <sxh js> |