2013-06-13 1 views
0

J'ai un modèle Backbone qui va chercher des données, traiter les données et ensuite une fonction devrait obtenir les données traitées.Comment passer un args à partir d'un jQuery différé

$.when(model.fetch()) 
    .done(function(){ 
    return model.processData() 
    }) 
    .then(function(processedData){ 
    //make something with the processed data 
    }) 

Malheureusement, la méthode then obtenir le résultat de l'appel model.fetch() et non la valeur de retour de la fonction done

+2

Remplacer '' done' avec then'. Voir http://api.jquery.com/deferred.then/. –

+0

C'était rapide, merci –

Répondre

1

Vous devez utiliser .then au lieu de .done. .then renvoie une nouvelle promesse qui est résolue avec la valeur renvoyée par la fonction de rappel. D'autre part, renvoie l'objet de promesse d'origine et la valeur de retour du rappel est simplement ignorée.

Plus d'informations peuvent être trouvées dans le documentation (mettre l'accent sur le mien):

À partir de jQuery 1.8, la méthode deferred.then() retourne une nouvelle promesse qui peut filtrer l'état et les valeurs d'un différé en fonction, en remplaçant la méthode maintenant obsolète deferred.pipe(). Les fonctions doneFilter et failFilter filtrent l'état et les valeurs résolus/rejetés d'origine différée. La fonction progressFilter filtre les appels aux méthodes notify ou notifyWith différées d'origine. Ces fonctions de filtre peuvent renvoyer une nouvelle valeur à .done() ou .fail() les rappels de la promesse, ou ils peuvent renvoyer un autre objet observable (différé, promesse, etc.) qui passera son statut résolu et rejeté et les valeurs aux rappels de la promesse . Si la fonction de filtre utilisée est null ou non spécifiée, la promesse sera résolue ou rejetée avec les mêmes valeurs que l'original.

1

Pour intercepter , modifier ou filtre données à partir d'un gestionnaire done à d'autres appels, vous pouvez utiliser la méthode .pipe().

Même si, dans votre exemple, vous pouvez simplement remplacer entièrement le .done(), avec votre gestionnaire directement .then, il pourrait aussi ressembler à:

$.when(model.fetch()) 
    .pipe(function() { 
     return model.processData(); 
    }) 
    .then(function(processedData){ 
    //make something with the processed data 
    }); 

Bien sûr, cela ne fait pas trop de sens comme mentionné ci-dessus , mais pensez aux possibilités de .pipe() de toute façon. Cela peut être un outil très pratique.

+0

'.pipe' est déprécié maintenant si. Ce comportement a été ajouté à '.then'. –

+0

@FelixKling Je ne savais pas qu'il a été déclaré comme obsolète, je vais avoir une lecture. – jAndy

+0

Il y avait une longue discussion à ce sujet afaik. Cela a été fait pour se conformer davantage à la proposition originale de CommonJS Promises/A: http://wiki.commonjs.org/wiki/Promises/A. –

1

$.when() ne devrait pas être nécessaire.

Voici deux possibilités:

model.fetch().then(function() { 
    return model.processData() 
}).then(function(processedData){ 
    //make something with the processed data 
}); 

ou, si processData() est synchrone:

model.fetch().done(function() { 
    var foo = model.processData(); 
    //make something with the processed data, foo 
});