javascript - sincronas - ¿Nunca resolvió las promesas porque la fuga de memoria?
promesas typescript (1)
Bueno, supongo que no guardas una referencia explícita ya que eso lo obligaría a permanecer asignado.
La prueba más simple en la que podría pensar es en realidad asignar muchas promesas y no resolverlas:
var $q = angular.injector(["ng"]).get("$q");
setInterval(function () {
for (var i = 0; i < 100; i++) {
var $d = $q.defer();
$d.promise;
}
}, 10);
Y luego mirando el montón en sí mismo. 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 megabytes para toda la página JSFIddle.
Desde el otro lado, si miramos el código fuente de $q
Podemos ver que no hay referencia desde un punto global a ninguna promesa en particular, sino solo a partir de una promesa a sus callbacks. El código es muy legible y claro. Veamos qué pasa si tiene una referencia de la devolución de llamada a la promesa.
var $q = angular.injector(["ng"]).get("$q");
console.log($q);
setInterval(function () {
for (var i = 0; i < 10; i++) {
var $d = $q.defer();
(function ($d) { // loop closure thing
$d.promise.then(function () {
console.log($d);
});
})($d);
}
}, 10);
Entonces, después de la asignación inicial, parece que es capaz de manejar eso también :)
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 llamadas.
En resumen, al menos en los navegadores modernos, no tiene que preocuparse por las promesas no resueltas siempre que no tenga referencias externas sobre ellas.
Tengo una promesa Lo creé para cancelar una solicitud de AJAX si lo necesito. Pero como no necesito cancelar ese AJAX, nunca lo resolví y AJAX se completó con éxito.
Un sinippet 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?
¿Nunca resolvió promesas como esa porque la memoria pierde? ¿Tiene algún consejo sobre cómo administrar el ciclo de vida de las promesas?