0

J'ai un code qui appelle Google Maps en mode asynchrone:Trouver une bonne façon de passer par un rappel avec l'API Google Maps

var directionsService = new google.maps.DirectionsService; 
directionsService.route(arg1, callback); 
directionsService.route(arg2, callback); 
directionsService.route(arg3, callback); 

function callback(response, status) { 
    // complex function here 
} 

En ce moment, chaque résultat de rappel en un seul morceau de données qui sont stockées dans un variable globale. Le design a quelque peu grandi et maintenant je voudrais inclure un paramètre avec chacun des callbacks. Mais je ne peux pas le faire directement, puisque je ne contrôle pas directionsService.route. Il me semble également que c'est déjà une manière détournée de gérer le problème; Je préfère passer arg1, arg2, arg3 et leurs paramètres à une fonction qui peut gérer les choses asynchrones et nettoyer quand tout est revenu. Des suggestions sur ce qui est la meilleure façon d'y parvenir?

Je pourrais creuser mon trou plus profond en ajoutant un autre global et en le mettant à jour entre les appels. Je pourrais écrire un wrapper pour directionsService.route qui l'enveloppe dans une autre couche de callback indirection. Je pourrais essayer de matraquer le format de rappel en un correspondant à celui requis par une bibliothèque comme async. Je pourrais écrire plusieurs versions de ma fonction de rappel, ou le remplacer par un générateur de fonctions. Certaines de ces options sont-elles raisonnables? Y at-il quelque chose de mieux? Honnêtement, il s'agit d'un petit projet et je n'ai pas besoin de quelque chose qui évolue bien, mais pour ma tranquillité d'esprit, je voudrais quelque chose d'inébranlable et un peu sec.

Répondre

1

J'ai écrit un code simple qui distribue un événement avec la fonction de rappel. Lorsque l'événement est expédié, vous avez un simple eventListener, avec tous les paramètres que vous voulez, qui appellent votre grande fonction.

Ceci est mon code:

var directionsService = new google.maps.DirectionsService; 

// Listen for the event. 
var aParameter = 35; 
window.addEventListener('build', function (e) { console.log("OK EVENT. With a prameter: " + aParameter); /* Now, call a function with parameters:*/ aFunction (aParameter); }, false); 

directionsService.route(arg1, callback); 

function callback() { 
    console.log("OK CALLBACK."); 
    var event = new Event('build'); 
    // Dispatch the event. 
    window.dispatchEvent(event); 
} 

function aFunction (parameter) { 
    console.log (parameter); 
} 

Vous pouvez également envoyer des événements avec des paramètres comme l'état avec:

var event = new CustomEvent('build', { detail: elem.dataset.time }); 

function eventHandler(e) { 
    console.log('The time is: ' + e.detail); 
} 

Consulter le MDN page sur l'événement.

Dites-moi si vous avez des questions.