Opérations asynchrones et valeurs de retour en JavaScript : résoudre l'énigme
En JavaScript, les opérations asynchrones, telles que les requêtes réseau ou la gestion des événements, sont souvent présentent des défis lorsqu’ils tentent de renvoyer leurs résultats de manière synchrone. Une telle situation est illustrée par la fonction jQuery suivante :
function trackPage() {
var elqTracker = new jQuery.elq(459);
elqTracker.pageTrack({
success: function() {
elqTracker.getGUID(function(guid) {
alert(guid);
var returnValue = guid; // Attempt to assign the GUID to a variable
});
}
});
return returnValue; // Return the assigned variable
}
Dans ce scénario, l'objectif est d'obtenir la valeur GUID de manière asynchrone et de la renvoyer à l'appelant. Cependant, la variable returnValue reste indéfinie, rendant le retour synchrone inefficace.
Comprendre la nature des opérations asynchrones
Le nœud du problème réside dans la nature asynchrone du opération getGUID. Les opérations asynchrones lancent et poursuivent leur exécution sans bloquer le thread principal. Cela implique qu'au moment où l'instruction return dans trackPage est atteinte, l'appel getGUID n'est pas encore terminé et son résultat n'est pas disponible.
Solutions utilisant les fonctions de rappel et les promesses
Deux approches principales relèvent ce défi :
Refactorisation du code :
Utilisation du mode différé solution objet, le code peut être refactorisé comme suit :
function trackPage() {
var elqTracker = new jQuery.elq(459);
var dfd = $.Deferred();
elqTracker.pageTrack({
success: function() {
elqTracker.getGUID(function(guid) {
dfd.resolve(guid); // Resolve the Deferred object with the GUID
});
}
});
return dfd.promise(); // Return a promise that represents the result
}
// Example usage:
trackPage().done(function(guid) {
// Guid is now available as the parameter to the done callback
alert("Got GUID: " guid);
});
Ce code refactorisé utilise un objet Deferred pour représenter l'opération asynchrone et permet une flexibilité dans l'attachement de rappels pour récupérer le résultat lorsqu'il devient disponible.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3