Promise.all resolvendo antes do esperado
Estou escrevendo meu primeiro pedaço de código usando o Promises e estou obtendo resultados inesperados. Eu tinha algum código parecido com este (usando jQuery):
$('.loading-spinner').show();
$('.elements').replaceWith(function() {
// Blocking code to generate and return a replacement element
});
$('.newElements').blockingFunction();
$('.loading-spinner').hide();
Para evitar que a página seja bloqueada quando esse código é executado, tentei usar setTimeout e Promises para torná-lo assíncrono, assim:
$('.loading-spinner').show();
var promises = [];
var promises2 = [];
$('.elements').each(function(i, el){
promises[i] = new Promise(function(resolve, reject) {
setTimeout(function() {
$(el).replaceWith(function() {
// Code to generate and return a replacement element
});
resolve(true);
}, 100);
});
});
Promise.all(promises).then(function(values) {
$('.newElements').each(function(i, el) {
promises2[i] = new Promise(function(resolve, reject) {
setTimeout(function() {
$(el).blockingFunction();
resolve(true);
}, 100);
});
});
});
Promise.all(promises2).then(function(values) {
$('.loading-spinner').hide();
});
O que estou tentando alcançar é que, uma vez que as promessas empromises
resolvidas, as promessas empromises2
são instanciados. Uma vez resolvidos, o botão giratório de carregamento fica oculto.
O efeito que estou obtendo é que, enquanto a página não fica bloqueada por muito tempo, o botão giratório desaparece assim que todas as promessas são definidas, sem esperar até que sejam resolvidas.
Eu posso ver que opromises2
Promessas não resolvem até que tudopromises
está resolvido, então eu não entendo por que isso está acontecendo. Eu acho que isso se deve a mim não entender as promessas corretamente ou não subestimar a codificação assíncrona.