2011-03-02 7 views
0

J'ai du mal à apprendre à utiliser le nouveau jQuery différé.jquery différé

Le fait un appel ajax et je veux retourner les données de l'appel ajax.

checkIDExists = function(id){ 
    var exists = false; 
    $.ajax({ 
     data: { 
      method: "idExists", 
      id: id 
     }, 
     success: function(data){ 
       if(data == 'true'){ 
        exists = true; 
       } 
     } 
    }).done(function(){ 
     return exists; 
    }).fail(function(){ 
     return false; 
    }); 
}; 

Je sais que le problème vient quand je tente de retourner quelque chose à l'intérieur du fait() ou échec() fonctions qui ne revient pas pour la fonction checkIdExists(). Comment est-ce que je travaille autour de ceci?

Répondre

2

Ajax lui-même fonctionne de manière asynchrone, donc la fonction checkIDExists se termine plus tôt, puis l'appel ajax renvoie des données du serveur.

Dans votre cas, je ne compterais pas sur la valeur de retour de la fonction checkIDExists, mais j'écrirais la fonction en utilisant l'approche CPS.

4

Les déclarations de Lloyd sont correctes, autant que je sache, mais je ne pense pas que c'est exactement la réponse que vous cherchez, voici ma tentative:

Tout d'abord, lorsque l'on travaille avec des promesses différées la seule chose raisonnable attendre et fournir comme valeur de retour est un objet de promesse (d'où la raison pour laquelle Lloyd vous indique CPS).

Où vous normalement faire quelque chose comme

/* Have some kind of callback for when ajax is done */ 

var myCompleteCallback = function(data){ 
    // whatever you want to do with your ajax call results 
} 

var myErrorCallback = function(){ 
    // handle the ajax error 
} 

/* Send the actual ajax request, and tell it to call MyCompleteCallback afterwards */ 

    $.ajax({ 
    url: '/foo/bar.xml' 
    data: {}, 
    success: myCompleteCallback, 
    error: 
    }); 

Vous feriez comme par exemple dans un implementaion style deffered:

/* Have some kind of callback for when promise is resolved is done */ 

var myCompleteCallback = function(data){ 
    // whatever you want to do with your ajax call results 
} 

var myErrorCallback = function(){ 
    // handle the ajax error 
} 

/* you could also do ajax.done().fail() but i think this reads better as an example */ 

var getsomething = $.ajax({ url: '/foo/bar.xml', data: {} }); 
getsomething.then(myCompleteCallback, myErrorCallback) 

Comme vous le voyez, il n'y a pas grand-chose magique et différent à ce sujet, sauf quand vous commencez à entrer dans des exemples plus complexes.

Ce qui est cool à ce sujet si (suite de l'exemple précédent) ...

var getVisitorInfo = function(){ 

    /* stash the user information ajax call promise */ 

    var fetchUserInfo = $.ajax({url:"/some/api/user.json"}) 

    /* stash the account information ajax call promise */ 

    var fetchAccountInfo = $.ajax({url:"/some/api/user.json"}) 

    /* trigger both calls and returns a promise that will resolve to both results */ 

    return $.when(fetchUserInfo, fetchAccountInfo) 
} 

/* Usage: */ 

getVisitorInfo().done(function(userJSON, accountJSON){ 
    // manipulate your data/ui/and whatnot 
}).fail(function(failure1,failure2){ 
    // redirect to login or whatever 
}) 

Hope this helps. Je suggérerais de jeter un coup d'oeil à diverses mises en œuvre différées/promises pour mieux comprendre tout cela. Ce qui m'a vraiment aidé était de jouer avec la bibliothèque Kris Kowal's Q (et la bonne qualité README qu'il fournit) et lire à ce sujet sur le CommonJS wiki. Et Kris a également donné talk on the topic back in 2010