Eu tenho um Promise
. Eu o criei para cancelar uma solicitação AJAX, se necessário. Mas como não preciso cancelar aquele AJAX, nunca resolvi e o AJAX foi concluído com êxito.
Um snippet 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?
Promessas nunca resolvidas como essa causam vazamentos de memória? Você tem algum conselho sobre como gerenciar o Promise
ciclo de vida?
javascript
angularjs
memory-leaks
promise
angular-promise
Umut Benzer
fonte
fonte
Respostas:
Bem, presumo que você não mantenha uma referência explícita a ele, pois isso o forçaria a permanecer alocado.
O teste mais simples que eu poderia pensar é realmente alocar um monte de promessas e não resolvê-las:
E então observando a própria pilha. Como podemos ver nas ferramentas de criação de perfil do Chrome, isso acumula a memória necessária para alocar 100 promessas e então apenas "permanece lá" com menos de 15 megabyes para toda a página JSFIddle
Por outro lado, se olharmos para o
$q
código-fontePodemos ver que não há referência de um ponto global a qualquer promessa em particular, mas apenas de uma promessa a seus retornos de chamada. O código é muito legível e claro. Vamos ver se você, entretanto, tem uma referência do retorno de chamada para a promessa.
Portanto, após a alocação inicial - parece que também é capaz de lidar com isso :)
Também podemos ver alguns padrões interessantes de GC se deixarmos seu último exemplo rodar por mais alguns minutos. Podemos ver que demora um pouco - mas é capaz de limpar os callbacks.
Resumindo - pelo menos nos navegadores modernos - você não precisa se preocupar com promessas não resolvidas, desde que não tenha referências externas a elas
fonte
var b = $http.get(...)
ou adicione um callback a ela. Isso também tem uma referência a isso. Se algo resolve (como você disse - muito tempo para resolver ainda significa resolver) - tem que ter uma referência a isso. Então, sim - não será GC'd