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);
});
});
}
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
ça ne marcherait pas:
function callback(f1, f2) {
f1();
f2();
}
Quant aux arguments de passage, soyez créatif.
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.