Attendre AJAX pour terminer, avant de retourner à partir de la fonction?

J'ai le texte suivant

function doAjax()
{
  var result = false;
  $.ajax(url, data)
    .done(function(){
       //Do a bunch
       //of computation
       //blah blah blah
       result = true;
    }).fail(function(){
       result = false;
    });
  return result;
}

function doSomething()
{
  if ( doAjax() == true )
    console.log('success');
  else
    console.log('failed');
}

function doSomethingElse()
{
  if ( doAjax() == true )
    console.log('success');
  else
    console.log('failed');
}

J'ai une fonction qui s'exécute quelques ajax, puis retourne true ou false selon que l'ajax a réussi ou pas. Cette fonction ajax-je appeler à partir de plusieurs endroits dans mon code.

Parce que la fonction se termine avant que l'ajax est terminée, il retourne toujours false. Comment puis-je éviter cela?

J'ai lu quelque chose de ce qui suggère que je fais une return $.ajax() dans ma fonction, puis déplacez le .done() et .fail() fonctions de mon doSomething() et doSomethingElse() fonctions. Cependant, dans mon .done() méthode, je fais un TAS de calcul. Beaucoup de code. Donc, le problème est que si je déplace le .done() fonction de mes autres fonctions, je suis la duplication d'un tas de code.

Comment puis-je éviter cela? Juste envelopper le calcul dans la fonction et de l'appeler chaque fois que nécessaire?

result toujours return false, et c'est normal, parce que la requête ajax est asynchrone. Si vous avez vraiment a utiliser .done() ou fonction de rappel. Et oui: pour éviter la duplication de code (si vous en quelque sorte eu ce problème) ensemble de code nécessaire de séparer la fonction.

OriginalL'auteur Jake Wilson | 2014-08-27