Page 1 of 1

Objet Web en série

Posted: 17 Dec 2014, 07:43
by Violette
Bonjour,
bon ce n'est pas vraiment un bug mais il y a 2 petits soucis avec l'objet Web.
(Je précise que j'utilise uniquement le code)

Le premier déjà : Quand Actiona n'a plus d'action à effectuer dans sa pile, le script s’arrête donc les fonctions de callback n'arrivent jamais si on ne laisse pas tourner une boucle dans le vide ou n'importe quoi histoire que la pile ne soit pas vide.
On se retrouve donc à écrire des while (data.isDownloading() === true) {} pour pas que le script s’arrête.

Le deuxième : Voila un code en exemple qui au passage, ruine l'asynchrone de la fonction. La boucle while, outre de résoudre le pb numéro 1, résout un autre problème ici. Ce problème c'est la variable i. Voilà ce qu'il se passe :

Tour de boucle :
[*]Un objet Web est initialisé
[*]download est appellé
[*]Attente que le téléchargement soit fini
[*]Des que téléchargement fini, onFinished est appelé il se sert du compteur de la boucle pour savoir quel est le bon objet dans le tableau

Et cela x nombre de fois

Code: Select all

for (var i = 0; i < url.length; i++) {
      data[i] = new Web({
         onFinished : function() {
            image[i] = data[i].toImage();
         },
         onError : function(error) { 
            erreur[url[i]] = error;
         }
      });
      data[i].download(url[i]);
      while (data[i].isDownloading() === true) {}
}
Si on met le while à l'extérieur du for, le téléchargement se sérialise et devient asynchrone, cool. Le seul soucis est que dans ce cas i n'est plus utilisable car on sort de la boucle, donc on ne peux plus retrouver l'objet dans le tableau. Bon je ne sais pas si c'est très clair, c'est pas facile à expliquer... On peux en les ajoutant avec push mais on perd l'ordre de l'index. Par exemple un tableau numéro 1 contient les url dans un certains ordre, il faut que l'ordre de l'index corresponde avec le tableau 2 contenant les objets téléchargés .

Il faudrait pouvoir définir un paramètre aux fonctions de callback, au moins onFinished et onDownloadProgress ou sinon qu'elles retournent en paramètre l'objet qui les a appelé.

Code: Select all

onFinished : function(i) {
            tab2[i] = tab1[i].toImage();
         }
Je sais pas si ce que je dit est compréhensible :xxx

Re: Objet Web en série

Posted: 17 Dec 2014, 14:05
by Jmgr
1) C'est normal. La boucle est la solution à appliquer ici. La philosophie du Code c'est de ne jamais bloquer, à part les fonctions waitForXXX. Libre à l'utilisateur de bloquer loi-même l'exécution s'il le souhaite.

2) Pourquoi ne pas faire une boucle qui vérifie que tout a bien été téléchargé, après ta boucle for ?

Code: Select all

var finishedDownloading = false;
while(!finishedDownloading)
{
    finishedDownloading = true;
    for (var i = 0; i < url.length; i++)
    {
        if(data[i].isDownloading())
        {
            finishedDownloading  = false;
            break;
        }
    }
}

Re: Objet Web en série

Posted: 17 Dec 2014, 17:18
by Violette
Ok je voit ouais.
Ben c'est ce que j'ai fait au final une variable qui s'incrémente grâce au onFinished et dès que ce nombre est égale à la taille du tableau => fin ^^.
Merci.