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

Aucune réponse