jquery when / then (également quand / done) n’attend pas

J’ai consulté de nombreux exemples utilisant cette syntaxe, mais je ne vois pas ce que je fais “mal”. La fonction “then” est en cours d’exécution avant le retour de l’appel ajax.

J’ai aussi essayé d’utiliser $ .deferred et quelques autres modèles en vain.

Quelqu’un peut voir ce que je manque?

J’ai débogué et je peux voir les appels passés depuis l’intérieur des données done / alors avant que l’appel ajax ne renvoie ses données de succès (ou d’erreur).

Merci pour toute aide.

Appel principal:

this.addFirstTask = function(task) { var totalHours = GetHours(); $.when(totalHours).done(function (data) { task.TaskHours(data); self.add(task); }); }; 

Il appelle la fonction ajax suivante:

 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’append le retour à l’appel ajax, selon l’avis supplémentaire, j’ai supprimé succès et erreur de l’appel ajax et modifié addFirstTask en:

 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 mets à jour la valeur TaskHours. Si cela échoue, je le saute simplement. J’ai réalisé que DONE est comme un “ENFIN” dans le programme try / catch de .NET. Ainsi, plutôt que d’append la tâche immédiatement et de laisser ensuite ma liaison observable la mettre à jour lorsque la valeur revient, même le fichier self.add fait partie de l’appel asynchrone.

 function GetHours() { return $.ajax({ ... }); }; 

$ .ajax () renvoie une promesse. $ .when () prend une collection de Promises et retourne une promesse qui se termine lorsque toutes les promesses en entrée se terminent .then () est une méthode de Promise (dans ce cas, la promesse enveloppante créée par when ()) function arg quand la promesse se résout avec succès.

Ainsi, votre GetHours doit renvoyer une promesse que when () peut boucler et vous appelez then (). vous pouvez en fait sauter la partie when () et simplement appeler .then au retour de GetHours.

vous n’obtenez pas d’erreur, car .when () prend également n’importe quel object ancien. S’il n’implémente pas l’interface Promise, il le traite simplement comme une promesse déjà complétée.

Ce n’est pas le problème des PO, mais quelque chose de semblable m’est arrivé, parce que j’appelais $ .when (…) à tort en passant un tableau de promesses.

Selon la documentation de jQuery.when si vous souhaitez attendre plusieurs objects différés, vous devez effectuer l’appel en tant que tel:

 $.when( d1, d2 ).then(....); 

Cela signifie que si vous avez plusieurs objects différés dans un tableau, vous devez utiliser apply (…) , sinon $ .when ne fonctionnera pas correctement. Donc, votre appel pour un tableau d’objects différés ressemblerait à ceci:

 $.when.apply(this, arrayOfDeferred).then(....); 

Voici un JS Fiddle démontrant ceci:

https://jsfiddle.net/Lvo4hrez/11/

Vous devez renvoyer le résultat de $ .ajax à partir de la fonction GetHours.