web-dev-qa-db-fra.com

Comment ajouter un rappel à une fonction en javascript

J'ai deux fonctions javascript

function one () {
   do something long... like writing jpgfile on disk
}

function two () {
   do something fast... like show the file
}

Je l'appelle (en jQuery) comme ça

 one ();
 two ();

Parce que la fonction deux a besoin du fichier de liens de la fonction un, je dois être sûr que l'exécution est terminée ... donc obtenir la fonction deux dans le rappel de la fonction un devrait être l'astuce .. mais comment faire cela?

note: j'ai mis une alerte ('aaa') entre ces deux fonctions pour en laisser une complète, et ça a bien fonctionné ... lorsque l'alerte est commentée, rien ne fonctionne plus!

22
menardmam

Vous ne devez utiliser un rappel que si vous effectuez une opération asynchrone. Sinon, le temps nécessaire à l'exécution de la tâche suivante n'a pas d'importance, la fonction suivante ne s'exécutera pas tant que la première ne sera pas terminée.

Un rappel consiste simplement à transmettre une fonction en tant qu'argument, puis à l'appeler une fois l'opération terminée.

function one (callback) {
   do something long... like writing jpgfile on disk
   callback();
}

function two () {
   do something fast... like show the file
}

one(two);

Évidemment, si vous êtes faites quelque chose d’asynchrone, alors vous avez besoin de quelque chose qui vous dira quand cela sera fini (comme un événement déclenché).

46
Quentin

Simple:

function one (callback) {
   do something long... like writing jpgfile on disk

    if(callback) callback();
}

function two () {
   do something fast... like show the file
}

one(two);
13
Joe

Essaye ça,

$.when($.ajax(fuction1())).then(function () {

fuction2;

});

Ici, fuction1 est votre première fonction à appeler et fuction2, votre deuxième fonction.

4
Jinesh

Je pense que c'est facile si le navigateur attend que le processus à l'intérieur de "one ()" soit terminé avant d'exécuter la ligne suivante de la commande. L'iceberg a frappé Titanic parce qu'il n'attend pas. Puis en exécutant ceci:

one(two) // while two is the callBack parameter

n'est rien différent de:

one()
two()

Je suggère d'utiliser un setInterval.

function one(){
    //--- Write the file to disk
    //.....................
}

function runTwo(){
    if (check_the_written_file_existence){
         clearInterval(t)
         two();
    }
}
var t = setInterval("runTwo()",500)

Le point le plus important est que s’il ya un événement qui se déclenche lorsque le "processus long" de la fonction "one ()" l’a fait, il vous suffit de lier la fonction deux à cet événement. À moins que vous ne deviez vérifier le résultat de façon générale toutes les périodes jusqu'à ce que ce soit vraiment fait.

0
vantrung -cuncon