10
votes

Les appels de fonction de séquençage dans JavaScript - sont des rappels le seul moyen?

J'ai lu à travers divers threads comme Celui-ci par exemple.

Mais cela m'échappe vraiment comment accomplir ce qui suit:

J'ai 4 fonctions et que vous voulez qu'ils se produisent l'un après l'autre en séquence. Remarquez qu'ils sont dans une commande incorrecte, pour faire passer mon point de vue. Je veux le résultat qui produira "1, 2, 3, 4 ' xxx

J'ai essayé de comprendre des rappels mais je me perds: (

N'y a-t-il pas un moyen simple de faire cela? Comme une boucle à travers un tableau ...


1 commentaires

Vous êtes peut-être intéressé à jeter un coup d'œil aux promesses et jQuery Objets différés .


5 Réponses :


1
votes

L'idée est que vous feriez quelque chose comme ce qui suit, de sorte qu'une fois la première fonction effectuée en cours d'exécution, elle sache quoi s'exécuter, par opposition à vous avoir à comprendre à votre extérieur de la fonction:

function firstFunction(callback){
  // some very time consuming asynchronous code...
  console.log('1');

  return callback(function(){
    alert("Second function finished.");
    return true;
  });
}
function secondFunction(callback){
  // waits for firstFunction to be completed
  console.log('2');

  return callback();
}

firstFunction(secondFunction);


3 commentaires

Cela ne devrait-il pas être "premier fonction fini" ou suis-je épais?


C'est un peu des deux, mais il s'agit principalement de la deuxième fonction que réellement se termine parce que cela transmet la fonction à la deuxième fonction. En d'autres termes, cette alerte alertera lorsque la deuxième fonction appelle le rappel, pas lorsque la première fonction appelle la deuxième fonction.


C'est pourquoi je ne peux pas supporter ce genre de rappel, c'est vraiment difficile à suivre les fenêtres.



15
votes

C'est une excellente occasion de commencer à utiliser jQuery différé .

Outre la solution basée sur les rappels Le code est lisible, flexible et hautement responsable

http://jsfiddle.net/zerkms/zjhph/ xxx

ps: comme exemple de code asynchrone, j'ai utilisé Settimeout . L'essentiel est que, à la fin de la partie asynchrone, vous devez appeler d.Resolve () pour continuer les méthodes de chaînage.

lecture supplémentaire: Http://joseoncode.com/2011/09/26/a-walkthrougough-jquery-deferred-and- promesse /


11 commentaires

Vous devez appuyer sur la coche décrite dans le vote UP Vut / Down s'il s'agit de votre réponse sélectionnée.


Sauf que ce n'est pas vraiment ma réponse acceptée: P cuz je ne comprends pas!


@tim: s'il vous plaît lire ps. Les délais d'attente sont destinés à simuler les asynchrones. Remplacez-les par votre logique Async.


"Cuz je ne comprends pas" --- Oh, au moins c'est honnête: - Avez-vous lu le lien "En plus de lecture"?


@zerkms, j'aime bien l'approche. Alors, dites-vous que je prépare chaque fonction en tant qu'objet différé, et lorsque j'ai terminé, je retourne son .Pomise () afin de pouvoir les enchaîner avec .Pipe ()? J'apprécierais vraiment si vous pouvez expliquer ce que vous avez fait un peu plus. Merci.


@tim: le prochain tuyau est appelé lorsque le précédent est résolu par .resolve () . C'est ça.


@zerkms, attendez une minute ... la déclaration de retour ne serait pas exectée avant la fin du délai d'attente?


@IM: Eh bien, je n'étais pas suffisamment précis: le raclage du tuyau n'est appelé qu'après la résolution du tuyau précédent. Donc, la déclaration de retour est exécutée immédiatement, et il a un objet promessant JQuery, mais qu'est-ce que la pipeline sera appelée uniquement après la promesse est résolue.


Comment faites-vous cela si la deuxième fonction dit un paramètre? fiducifunction (). Tuyau (DateNfunction (param)). Tuyau (Thirdfuncti sur) .pipe (quatrième ions); ?


@Nilssens tuyau (() => DateNfunction (param)) . Donc, vous passez une autre fonction qui appelle un secondfunction avec un argument. Parce que sinon, vous appelez immédiatement une fonction.


J'ai trouvé cette réponse utile. Juste un commentaire: $. Tuyau est obsolète de JQuery 1.8 en faveur de $. Alors .



0
votes

Si j'utilise des rappels, ma solution de travail ressemble maintenant à ceci:

    one(two);
    function one(callb){
        console.log('1');
        callb(three);
    }
    function four(){
        console.log('4');
    }
    function two(callb){
        console.log('2');
        callb(four);
    }
    function three(callb){
        console.log('3');
        callb();
    }


2 commentaires

"Comment suis-je censé garder une trace de ce truc s'il y a plus de 2-3 séquences?" - n'a pas différé une panacée?


Après avoir lu dessus, il semble être le "remède de mes maux" (je devais chercher la panacée ...)



0
votes

Cela fait un moment et j'ai remarqué quelque chose sur différé code> dans la documentation de jQuery, spécifiquement le lorsque code> fonction API de base.

$.when( $.ajax("test.aspx") ).then(function(ajaxArgs){ 
     alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */
});


0 commentaires

0
votes

J'ai joué avec la promesse, la séquence, l'exception, le rappel pour comprendre comment cela fonctionne et a finalement fait ce code.

Appelez les fonctions avec le rappel et l'envoi de résultat en tant que paramètre à une autre fonction dans la séquence et avoir une erreur de capture. < / p> xxx


0 commentaires