2010-12-04 6 views
0

Tenir compte:Retour de données à partir de fonctions asynchrones anonymes?

function ajaxCall(url, callback) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     success: function (data) { // <-- fail point: where does the returned data go, now? 
      // do stuff with data 
      if (callback) { 
       var ret = callback(); 
       if (ret !== undefined) { 
        return ret; 
       } 
      } 
     } 
    }); 
} 

function fooBar() { 
    return ajaxCall('some/url', function() { 
     // do stuff 
     return some_value; 
    } 
} 

droit, donc en gros, je veux préserver la asynchronousness de la demande afin que le navigateur ne retourne se bloque pas, mais encore une valeur à la fin ... Ceci est un exemple simplifié, même si je pourrais probablement le simplifier encore plus.

En fait, le seul obstacle que je vois est la transition entre $.ajax et sa fonction anonyme success:.

Hmph.

+0

Attendez, ce n'est même pas valide JavaScript ... –

+0

Oui, désolé. Le '$ .ajax' n'a pas réussi à passer de mon esprit à l'écran. –

+0

Ah, je vois. Figuré, il doit avoir été une erreur de copier-coller. :) –

Répondre

3

Vous ne pouvez pas utiliser les appels de manière asynchrone comme ceci, les rappels s'exécutent plus tard après que votre fonction d'appel a depuis longtemps retourné. Au lieu de cela, ce que vous devez faire est d'appeler la fonction qui a besoin des données dans le cadre de la (ou la totalité) de rappel, par exemple:

function ajaxCall(url, callback) { 
    $.ajax({ 
    type: "GET", 
    url: url, 
    success: callback 
    }); 
} 

function fooBar() { 
    ajaxCall('some/url', function (data) { 
     functionThatNeedsData(data); 
    }); 
} 

C'est juste un exemple pour montrer ce qui se passe, dans la pratique, il pourrait juste être:

function fooBar() { 
    $.get('some/url', functionThatNeedsData); 
} 

Ce que vous appelez votre functionThatNeedsData qui obtient les données de la demande comme premier argument ... dès que le serveur répond avec des données, vous le transmettre là où il doit faire et faire le reste de votre travail avec ces données.

+0

Mais * Je veux que cette fonction renvoie des données *! Eh bien, je vais devoir le faire le long chemin ... –

+3

@passcod - Je ne sais pas quoi dire ... c'est juste comment les appels asynchrones fonctionnent, si vous pouviez revenir, ils seraient synchrone :) –

+0

Exactement. Mais maintenant je dois ajouter plus d'asyncité pour obtenir ce que je veux ... c'est-à-dire des événements personnalisés. Cette réponse est correcte, cependant. –

Questions connexes