Comment peut-jQuery différés être utilisé?
jQuery 1.5 apporte le nouveau Différé d'objet et le joint méthodes .quand
, .Différés
et ._Deferred
.
Pour ceux qui n'ont pas utilisé .Deferred
avant, j'ai annoté le source.
Quelles sont les utilisations possibles de ces nouvelles méthodes, comment pouvons-nous aller sur la côté d'eux dans les modèles?
J'ai déjà lu le API et la source, donc je sais ce qu'il fait. Ma question est comment pouvons-nous utiliser ces nouvelles fonctionnalités dans le quotidien de code?
J'ai un simple exemple d'un tampon de classe qui appelle à une requête AJAX dans l'ordre. (Prochain démarrage après le précédent se termine).
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
//empty resolved deferred object
var deferred = $.when();
//handle the next object
function handleNextTask() {
//if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
//grab a task
var task = tasks.shift();
//set the deferred to be deferred returned from the handler
deferred = handler(task);
//if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
//if we have tasks left then handle the next one when the current one
//is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
//appends a task.
this.append = function(task) {
//add to the array
tasks.push(task);
//handle the next task
handleNextTask();
};
};
Je suis à la recherche pour les démonstrations et les utilisations possibles de .Deferred
et .when
.
Il serait également agréable de voir des exemples de ._Deferred
.
Reliant à la nouvelle jQuery.ajax
source des exemples est de la triche.
Je suis particulièrement intéressé par quelles techniques sont disponibles lorsque nous abstraire de savoir si une opération est en mode synchrone ou asynchrone fait.
- À partir de la FAQ: éviter poser des questions subjectives où...chaque réponse est tout aussi valable: “Quelle est votre préférée ______?” (leur accent)
- Je vais regarder la remanier.
- C'est une bonne question, mais il ne peut pas être beaucoup de gens qui peuvent répondre 🙂
- J'ai surtout en regardant ceux qui l'a utilisé quand il était un 3e partie plugin. Et encourager les gens à s'asseoir et utiliser!
._Deferred
est tout simplement le vrai Différée "objet" qui.Deferred
utilise. C'est un objet interne qui vous aurez plus de chances de ne jamais avoir besoin.- Je sais qu'. Il est utilisé en interne, mais il est rendu accessible au public. Ce qui signifie que les gens peuvent l'utiliser, la seule différence est la possibilité de l'annuler, je ne sais pas ce intelligent de choses que nous pouvons faire avec ce supplément annuler la fonction. Le fait que vous pouvez annuler est utile. La seule référence que j'ai vu est la cartographie de n différée objets dans un différé d'objet et à l'annulation de tous lorsque l'on déclenche.
isResolved
est et/ou sera obsolète dans un avenir proche.- Comment cela est-il utilisé? pourriez-vous mettre un exemple pour montrer comment l'appeler?
- J'ai trouvé cela très utile jqfundamentals.com/chapter/ajax-deferreds
Vous devez vous connecter pour publier un commentaire.
La meilleure façon que je peux penser à est de mettre en cache les réponses AJAX. Voici une modification de l'exemple de Rebecca Murphey l'intro de post sur le sujet:
En gros, si la valeur a déjà été demandé une fois avant d'être retourné immédiatement à partir du cache. Sinon, une requête AJAX récupère les données et l'ajoute à la cache. Le
$.when
/.then
ne se soucie pas du tout de cela, tout ce que vous devez être préoccupé est à l'aide de la réponse, qui est passé à la.then()
gestionnaire dans les deux cas.jQuery.lorsque()
gère un non-Promesse/Reporté Terminé, juste de l'exécution de toute.done()
ou.then()
sur la chaîne.Deferreds sont parfaits pour quand la tâche peut ou peut ne pas fonctionner de manière asynchrone, et que vous voulez abstraite que la condition de code.
Un autre monde réel exemple d'utilisation de la
$.when
helper:$.when
nécessaire dans le premier extrait? Je crois.then
agit sur deferreds, etgetData
retourne déjà un.$.ajax
objet, mais un générique JS qui peut ou ne peut pas (probablement pas) être différé. En tant que tel,$.when
est nécessaire parce qu'il gère ces cas. Tout ce qui est passé à$.when
qui n'est pas un objet reporté est considéré comme un bien terminé différé.requirejs
. vous demandez-vous s'ils ont des semblables...cache[ val ]
PAS de retour d'une promesse (le jquery documentation indique que le paramètre est les données renvoyées par l'expéditeur), ce qui signifie que l'accès des membres de.then
l'erreur...droit? Ce qui me manque?$.when(...)
wrapper est nécessaire de répondre pour le cas où la non-thenable valeur mise en cache est retourné.Ici est un peu différente de la mise en œuvre d'un AJAX cache dans ehynd réponse.
Comme indiqué dans fortuneRice est question de suivi, ehynd de la mise en œuvre n'a pas réellement d'éviter que plusieurs demandes identiques si les demandes ont été effectuées avant que l'un d'entre eux étaient retournés. C'est,
le plus de chances d'3 requêtes AJAX si le résultat pour "xxx" n'a pas déjà été mis en cache avant.
Cela peut être résolu par la mise en cache à la demande du Deferreds à la place du résultat:
Un différé peut être utilisé à la place d'un mutex. C'est essentiellement le même que les multiples ajax scénarios d'utilisation.
MUTEX
DIFFÉRÉS
Lors de l'utilisation d'un Différé comme un mutex seulement, watch out pour les effets sur les performances (http://jsperf.com/deferred-vs-mutex/2). Bien que la commodité, ainsi que d'autres prestations fournies par un Différé est bien la peine, et en réel (actionné par l'utilisateur basée sur les événements) l'utilisation de l'impact de la performance ne devrait pas être perceptible.
C'est une auto-promotion de réponse, mais j'ai passé quelques mois à la recherche de cette et a présenté les résultats à jQuery de la Conférence de San Francisco 2012.
Voici une vidéo de la conférence:
https://www.youtube.com/watch?v=juRtEEsHI9E
Une autre utilisation que j'ai été de le mettre à bonne pour but d'extraire des données à partir de plusieurs sources. Dans l'exemple ci-dessous, je suis aller chercher de multiples, indépendants JSON objets de schéma utilisé dans une application existante pour la validation entre un client et d'un serveur. Dans ce cas, je ne veux pas le navigateur de l'application côté pour lancer le chargement des données avant qu'il dispose de tous les schémas chargé. $.lors de l'.appliquer().alors() est parfait pour cela. Merci à Raynos pour les pointeurs sur l'utilisation d'alors(fn1, fn2) afin de surveiller les conditions d'erreur.
Un autre exemple d'utilisation
Deferred
s pour mettre en œuvre un cache pour n'importe quel type de calcul (généralement des performances intenses ou de longue durée d'exécution des tâches):Voici un exemple d'utilisation de cette classe pour effectuer certains (simulé lourd) calcul:
Le même sous-jacent cache pourrait être utilisé pour mettre en cache les requêtes Ajax:
Vous pouvez jouer avec le code ci-dessus dans cette jsFiddle.
1) l'Utiliser pour vous assurer d'un ordre d'exécution de rappels:
2) l'Utiliser pour vérifier l'état de l'application:
Vous pouvez utiliser un différé objet pour faire un design fluide qui fonctionne bien dans les navigateurs webkit. Les navigateurs Webkit le feu de l'événement de redimensionnement pour chaque pixel de la fenêtre est redimensionnée, contrairement à FF et IE qui déclenche l'événement qu'une seule fois pour chaque redimensionner. Comme un résultat, vous n'avez aucun contrôle sur l'ordre dans lequel les fonctions liées à la fenêtre de votre événement de redimensionnement à exécuter. Quelque chose comme cela résout le problème:
Cela va sérialiser l'exécution de votre code, de sorte qu'il s'exécute comme vous l'a voulu. Méfiez-vous des pièges lors du passage de méthodes de l'objet de tant de rappels pour une rente différée. Une fois que cette méthode est exécutée comme un rappel différé, le " il " de référence sera remplacée par la référence à l'objet reporté et ne fera plus référence à l'objet de la méthode appartient à.
resizeQueue.done(resizeAlgorithm)
est exactement la même queresizeAlgorithm
. C'est un simulacre!.done
est faite.Vous pouvez également l'intégrer avec n'importe quel de la 3e partie des bibliothèques qui rend l'utilisation de JQuery.
Une telle bibliothèque est l'épine Dorsale, qui est en fait à prendre en charge Différée dans leur prochaine version.
read more here
en place deon my blog
. Son une meilleure pratique et peut vous sauver la réponse (accidentellement) d'être spammé. 🙂J'ai simplement utilisé Reportés dans le code réel. Dans le projet jQuery Terminal j'ai de la fonction exec appel des commandes définies par l'utilisateur (comme s'il était à l'entrée et en appuyant sur entrée), j'ai ajouté Deferreds à l'API et à l'appel exec avec des tableaux. comme ceci:
ou
les commandes peuvent exécuter async code, et exec besoin d'appeler le code de l'utilisateur dans l'ordre. Ma première utilisation de l'api paire de mettre en pause/reprendre les appels et les nouvelles API, j'appelle ceux automatique lorsque l'utilisateur de revenir à la promesse. Si le code utilisateur peut simplement utiliser
ou
- Je utiliser un code comme ceci:
dalyed_commands est utilisé dans la fonction de reprise que l'appel exec à nouveau avec toutes les dalyed_commands.
et une partie des commandes de fonction (je l'ai dépouillé de ne pas pièces connexes)
La réponse par ehynds ne fonctionnera pas, car il met en cache les réponses données. Il doit mettre en cache les jqXHR qui est aussi une Promesse.
Voici le bon code:
La réponse de Julian D. travail correct et est une meilleure solution.