11550 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'ai écris un script qui, à chaque fois qu'on tape une lettre dans une textbox, recherche les éléments d'une liste de produits qui contiennent le texte de la textbox. Comme j'ai pas mal de produits dans ma liste, l'exécution du script est un peu lente, et j'aimerais pouvoir interrompre son exécution quand l'utilisateur tape à nouveau sur une touche. Pour cela, je pense qu'il faut lancer les procédures de recherche dans des threads et interrompre le thread existant à chaque fois qu'un nouveau thread est lancé. Mais je ne sais pas si cela est possible en javascript...

merci d'avance pour votre aide
Javascript n'est pas assez évolué pour faire du multithreading, mais on peut imaginer les choses autrement.

Peut-être une idée : une variable globale qui est incrémentée à chaque nouvel appel de ta fonction de recherche, qui prendra un paramètre supplémentaire, la valeur de cette variable globale au moment de l'appel.
Dans ta fonction, tu vérifies périodiquement que la variable globale contienne la même valeur que la variable locale. Si elle est différente, cela signifie qu'un nouvel appel a eu lieu et qu'il faut donc arrêter celui en cours.

Je ne suis pas sûr du résultat que ça pourrait donner avec une variable booléenne dans le cas où 3 appels sont effectués rapidement, ce serait peut-être plus simple mais au moins avec un numérique on est sûr que ça marche à tous les coups.

Puisqu'un bout de code est toujours mieux qu'un long discours, voici un exemple rapide, non testé :

var instance_fonction = 0;
function ma_fonction (instance_en_cours) {
// début de ta boucle de recherche(tu utilises sûrement un for ou un while non ?)
if (instance_en_cours != instance_fonction) break;
// fin de ta boucle de recherche
}

document.getElementById('mon_champ').onkeyup = function () {
instance_fonction++;
ma_fonction(instance_fonction);
}
Hello,
mathmax a écrit :
J'ai par contre trouvé ces liens concernant le multi-threading avec javascript. Qu'en penses-tu ?
Il ne s'agit pas de JavaScript s'exécutant dans le contexte d'une page HTML. C'est impossible dans ce cas-là (et heureusement Smiley smile ).
J'ai dû m'interrompre un moment sur mon projet de recherche, mais je m'y remet enfin. J'ai testé l'idée de QuentinC, mais le problème est que l'événement onkeyup n'est appelé que quand la fonction "ma_fonction" à finie de s'exécuter. Du coup la condition if (instance_en_cours != instance_fonction) n'est jamais réalisé. Une idée pour que l'événement onkeyup soit levé pendant l'exécution de ma_fonction ? Ou autre chôse pour l'interrompre ?

merci
l'idée de Quentin est bonne pourtant;

par contre, je n'aurais pas passé la variable à la fonction;


var flag;

function auto(valeur){

    flag=false;
    // boucle for pour récupérer les correspondances
    // dans le tableau de données
    for(element in tableau){
        if(!flag){
            // traitement
        }
        else{ 
            return
        }
    }
}


monchamp.onkeyup=function(){
    flag=true;
    auto(this.value)
}


j'ai testé avec une boucle basique et je n'ai pas senti de problème; disons que si tout va bien, le changement du booleen est interprété avant le rappel de la fonction... juste le temps d'interrompre l'appel en cours;