Bonjour,
J'essais de trouver des info sur le comportement de l'api deferred de jQuery.
Je prépare un system de chargement ou à chaque étape j'utilise progress pour notifier l'état de l'étape.
Lorsque je met un timeout sur mon étape 3 la notification est bien récupérée, et à l'inverse lorsqu'il n'y a pas de timeout 1 et 2 je ne récupère pas la notification.
Y a t'il une erreur dans mon code ou est-ce que mes étapes 1 et 2 sont trop rapide à exécuter. Je ne comprend pas pourquoi je n'ai pas la notification dans la console.
[code]
<!DOCTYPE html>
<html>
<head>
<title>DEV TEST</title>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script>
var init_try = 1;
var init_try_max = 3;
var dev_mode = 0;
//Generation d'une durée aléatoire pour les Timeout
function tempo(){ return Math.round((Math.random()*3) * 1000); }
function chargement()
{
var deferred = $.Deferred();
console.log("etape 1");
try
{
if(dev_mode != 0){ deferred.resolve(1); }
else
{
deferred.notify("etape 1 ok");
deferred.resolve(1);
}
}
catch(err)
{
deferred.notify("etape 1 pok");
deferred.reject(1);
}
return deferred.promise();
}
function getconfig()
{
var deferred = $.Deferred();
console.log("etape 2");
try
{
if(dev_mode != 0){ deferred.resolve(2); }
else
{
deferred.notify("etape 2 ok");
deferred.resolve(2);
}
}
catch(err)
{
deferred.notify("etape 2 pok");
deferred.reject(2);
}
return deferred.promise();
}
function appliconfig()
{
var deferred = $.Deferred();
console.log("etape 3");
setTimeout( function (){
if(dev_mode != 0){ deferred.resolve(3); }
else
{
deferred.notify("etape 3 ok");
deferred.resolve(3);
}
},1);
return deferred.promise();
}
function doGo()
{
console.log("Do Go !!!");
}
function init()
{
if(init_try <= init_try_max)
{
chargement()
.then(getconfig)
.then(appliconfig)
.progress(function(data){ console.log(data) })
.done(function(){
doGo();
})
.fail( function(data) {
console.log("Erreur etape: "+data+" -Try:"+init_try);
if(init_try === init_try_max){ alert("Erreur etape : "+data); }
init_try++;
init();
});
}
}
init();
</script>
</head>
<body>
</body>
</html>
[/code]
Résultat dans navigateur:
[code]
etape 1
etape 2
etape 3
etape 3 ok
Do Go !!!
[/code]
Résultat souhaité
[code]
etape 1
etape 1 ok
etape 2
etape 2 ok
etape 3
etape 3 ok
Do Go !!!
[/code]
Si quelqu'un à une idée, je ne trouve pas pourquoi j'ai ce comportement.
Merci d'avance
Raphaël