jquery lorsque/alors (même si/fait) pas d'attente
J'ai regardé un grand nombre d'échantillons que l'utilisation de cette syntaxe, mais je ne vois pas ce que je"m fait mal. La "puis" la fonction est en cours d'exécution avant l'appel ajax retourne.
J'ai essayé aussi en utilisant $.reportés et quelques autres modèles en vain.
Quelqu'un peut voir ce que je suis absent?
J'ai débogué et vous pourrez voir les appels à partir de l'intérieur de la fait, puis avant l'appel ajax retourne c'est la réussite (ou l'erreur) de données.
Merci pour toute aide.
Principal de l'appel:
this.addFirstTask = function(task) {
var totalHours = GetHours();
$.when(totalHours).done(function (data) {
task.TaskHours(data);
self.add(task);
});
};
Qu'il appelle le suivant ajax fonction:
function GetHours() {
$.ajax({
url: "/api/tst/GetMyData",
type: 'GET',
dataType: 'json',
success: function(data) {
return data;
},
error: function(data) {
return 0;
}
});
};
Merci!
post-mortem:
en plus d'ajouter le retour à l'appel ajax, comme pour d'autres conseils, j'ai enlevé le succès & erreur de l'appel ajax et changé addFirstTask:
this.addFirstTask = function(task) {
var totalHours = GetHours();
$.when(totalHours)
.then(function (data) {task.TaskHours(data);})
.done(function () { self.add(task); });
};
Si GetHours réussit, je l'ai mise à jour de la TaskHours valeur. Si elle échoue, je l'ignorer. J'ai réalisé que ça FAIT, c'est comme un "ENFIN".NET est try/catch. Donc, plutôt que de l'ajout de la tâche, puis de laisser mon observables de liaison de mise à jour lorsque la valeur est de retour, même de soi-même.ajouter est la partie de l'appel asynchrone.
double possible de Pourquoi mon jQuery lorsque().alors() la fonction de déclenchement avant la requête ajax dans quand est-ce fait?
Gorkk, merci. Je promets que je l'ai cherché pendant des heures avant que j'ai posté. 🙂
OriginalL'auteur Julie Lerman | 2014-02-23
Vous devez vous connecter pour publier un commentaire.
$.ajax() renvoie une Promesse.
$.lorsque() prend une collection de Promesses, et retourne une promesse qui se termine lorsque toutes les entrées promesses complète
.alors() est une méthode de Promesse (dans ce cas, le wrapper Promesse que lorsque() créé) qui appelle c'est d'abord la fonction arg lorsque la promesse résout avec succès.
donc, votre GetHours doit renvoyer une Promesse que lorsque() peut envelopper, et que vous appelez le ().
vous pouvez réellement sauter le quand (partie) et il suffit d'appeler .puis sur le retour d'GetHours.
vous n'obtenez pas une erreur car .lorsque() prend tout objet ancien, et si ce n'est pas de mettre en œuvre la Promesse de l'interface, c'est juste le considère comme un déjà-rempli de Promesses.
$.ajax
.en effet. ces gestionnaires seront il suffit de retourner dans le bitbucket.
ahh merci (et pour Adam). C'est logique et est similaire à async/await. Je suis juste aussi peu familiers avec l'ajax.
jQuery promesses de travail comme des promesses ou des .Net tâches. Imaginez que vous écrivez le code C#;
$.ajax
renvoie uneTask
de la réponse, etthen()
signifieContinueWith()
. Lesuccess
eterror
les rappels que vous avez passé sont un vestige de l'ancien, non-promesse de base de l'API; ne les utilisez pas.Je vais essayer d'approfondir. Ces succès/gestionnaires d'erreur sera "retour" à personne. La fonction à l'intérieur de l' .alors() reçoit le même "données" que ces gestionnaires déclaré sur le .ajax() options. .ajax() renvoie une Promesse, pas le résultat de ses gestionnaires. Si vous souhaitez gérer l'erreur du côté de l'appel ajax, utilisez la 2ème arg sur la (les) méthode.
OriginalL'auteur
Ce n'est pas être la Fpo problème, mais j'ai eu quelque chose de semblable arriver et c'était parce que j'étais en appelant $.quand(...) de façon incorrecte par le passage d'un tableau de promesses.
Par la documentation de jQuery.lorsque si vous voulez attendre plusieurs Différés objets, vous devez faire appel en tant que tel:
Qui signifie que si vous avez plusieurs différés objets dans un tableau, vous devez utiliser appliquer(...), sinon $.quand ils ne fonctionnent pas correctement. Si votre appel pour un tableau de report d'objets ressemblerait à ceci:
Ici est un JS Fiddle de le démontrer:
https://jsfiddle.net/Lvo4hrez/11/
OriginalL'auteur
Vous avez besoin de retourner le résultat de $.ajax à partir de la GetHours fonction.
OriginalL'auteur