Tengo un Promise
. Lo creé para cancelar una solicitud AJAX si es necesario. Pero como no necesito cancelar ese AJAX, nunca lo resolví y AJAX se completó con éxito.
Un fragmento simplificado:
var defer = $q.defer();
$http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) {
// do something
});
// Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request?
¿Promesas nunca resueltas como esa causan pérdidas de memoria? ¿Tiene algún consejo sobre cómo gestionar el Promise
ciclo de vida?
javascript
angularjs
memory-leaks
promise
angular-promise
Umut Benzer
fuente
fuente
Respuestas:
Bueno, supongo que no mantiene una referencia explícita a él, ya que eso lo obligaría a permanecer asignado.
La prueba más simple que se me ocurre es asignar muchas promesas y no resolverlas:
Y luego mirando el montón en sí. Como podemos ver en las herramientas de creación de perfiles de Chrome, esto acumula la memoria necesaria para asignar 100 promesas y luego simplemente "permanece allí" a menos de 15 megabyes para toda la página JSFIddle.
Desde el otro lado, si miramos el
$q
código fuentePodemos ver que no hay referencia desde un punto global a ninguna promesa en particular, sino solo de una promesa a sus devoluciones de llamada. El código es muy legible y claro. Veamos qué sucede si, sin embargo, tiene una referencia de la devolución de llamada a la promesa.
Entonces, después de la asignación inicial, parece que también puede manejar eso :)
También podemos ver algunos patrones interesantes de GC si dejamos que su último ejemplo se ejecute durante unos minutos más. Podemos ver que lleva un tiempo, pero es capaz de limpiar las devoluciones de llamada.
En resumen, al menos en los navegadores modernos, no tiene que preocuparse por las promesas no resueltas siempre que no tenga referencias externas a ellas.
fuente
var b = $http.get(...)
o le agregue una devolución de llamada. Eso también tiene una referencia a eso. Si algo lo resuelve (como dijiste, demasiado tiempo para resolver aún significa resolver), tiene que tener una referencia. Entonces sí, no será GC'd