web-dev-qa-db-fra.com

Fonction de rappel multiple JavaScript

J'essaie de comprendre la fonction de rappel en Javascript depuis un certain temps sans succès. J'ai probablement le code encrassé, mais je ne reçois pas d'erreur Javascript, donc je suppose que la syntaxe est quelque peu correcte.

Fondamentalement, je cherche la fonction getDistanceWithLatLong () à terminer avant le début de updateDB (), puis à vérifier que cela se termine avant le début de la fonction printList ().

Je le fais fonctionner avec un appel "setTimeout" codé en dur sur les fonctions, mais je surcompensant et obligeant les utilisateurs à attendre plus longtemps sans avoir besoin du rappel automatique.

Aucune suggestion? Ci-dessous le code:

function runSearchInOrder(callback) {
    getDistanceWithLatLong(function() {
        updateDB(function() {
            printList(callback);
        });
    });
}
11
Rob

Pour ce faire, vous devez passer le prochain rappel à chaque fonction.

function printList(callback) {
  // do your printList work
  console.log('printList is done');
  callback();
}

function updateDB(callback) {
  // do your updateDB work
  console.log('updateDB is done');
  callback()
}

function getDistanceWithLatLong(callback) {
  // do your getDistanceWithLatLong work
  console.log('getDistanceWithLatLong is done');
  callback();
}

function runSearchInOrder(callback) {
    getDistanceWithLatLong(function() {
        updateDB(function() {
            printList(callback);
        });
    });
}

runSearchInOrder(function(){console.log('finished')});

Ce code affiche:

getDistanceWithLatLong is done
updateDB is done
printList is done
finished 
19
Joe Frambach

ça ne marcherait pas:

function callback(f1, f2) {
    f1();
    f2();
}

Quant aux arguments de passage, soyez créatif.

2
Yamcha

En JavaScript, tout est un objet, y compris les fonctions. C'est pourquoi vous pouvez passer des callbacks en tant que paramètres - vous passez une fonction comme s'il s'agissait de n'importe quel autre objet.

Dans chaque déclaration de fonction, vous devez exécuter le rappel.

function runSearchInOrder(callback) {

    ...

    callback();
}

function getDistanceWithLatLong(callback) {

    ...

    callback();
}

function updateDB(callback) {

    ...

    callback();
}

Ensuite, votre code affiché ci-dessus devrait fonctionner.

0
gregnr