2013-03-01 1 views
1

J'essaie de faire fonctionner le code suivant, mais je suis évidemment en train de me méprendre sur le fonctionnement de $ .Deferred. S'il vous plaît pourrait quelqu'un aider.Appel d'ajax en tant que promesse différée et erreur de réception

L'idée est, appel GetParameters, résultat du processus, appel GetStats, résultat du processus. Aussi à définir occupé à vrai avant et faux à après. Je m'attends à une seule erreur à se propager à .fail().

self.refreshParams = $.ajax({ 
      url: self.ToAddress() + "/GetParameters", 
      data: "{}", 
      type: "GET", 
      contentType: "application/javascript", 
      dataType: "jsonp" 
     }); 

    self.refreshMachines = $.ajax({ 
      url: self.ToAddress() + "/GetStats", 
      data: "{}", 
      type: "GET", 
      contentType: "application/javascript", 
      dataType: "jsonp" 
     }); 

    self.refresh = function() { 
     var d = $.Deferred(); 

     d.pipe(self.refreshParams) 
     .done(function (p) { 
      self.params(p); 
     }); 

     d.pipe(self.refreshMachines) 
     .done(function (m) { 
      self.machines(m); 
     }); 

     d.always(function() { 
     self.busy(false); 
     }) 
     .fail(function (x, e) { 
      self.errorText(x); 
     }); 

     d.resolve(); 
    } 

MISE À JOUR:

Je l'ai changé à:

 self.refreshParams = function() { 
      return $.ajax({ 
       url: self.ToAddress() + "/GetParameters", 
       data: "{}", 
       type: "GET", 
       contentType: "application/javascript", 
       dataType: "jsonp" 
      }); 
     }; 

     self.refreshMachines = function() { 
      return $.ajax({ 
       url: self.ToAddress() + "/GetStats", 
       data: "{}", 
       type: "GET", 
       contentType: "application/javascript", 
       dataType: "jsonp" 
      }); 
     }; 

     self.refresh = function() { 

      $.when(self.refreshParams(), self.refreshMachines()) 
      .done(function (p, m) { 
       self.params(p[0]); 
       self.machines(m[0]); 
      }) 
      .done(function() { 
      self.busy(false); 
      }) 
      .fail(function (x, e) { 
       self.errorText(x); 
      }); 
     } 

cela semble fonctionner si les services sont en hausse, mais s'il y a une erreur, rien get jusqu'à .fail ?

Répondre

0

Il n'y a pas de façon unique d'écrire du code de ce type. Il est préférable de travailler avec des gestionnaires .done() distincts et des gestionnaires .fail() pour les deux opérations ajax, en maintenant leur succès et la gestion des erreurs indépendants l'un de l'autre.

Ensuite, tout ce que vous devez faire en réponse à l'observateur composite .when() est de réinitialiser votre indicateur d'état occupé. En faisant cela dans un gestionnaire .always(), il sera réinitialisé indépendamment du résultat des deux opérations ajax.

Je serais probablement écrire quelque chose comme ceci:

self.refresh = function() { 
    self.busy(true); 

    var paramsPromise = self.refreshParams().done(self.params).fail(function (jqXHR, textStatus, errorThrown) { 
     self.errorText('refreshParams() : ' + textStatus + ' : ' + errorThrown); 
    }); 
    var machinesPromise = self.refreshMachines().done(self.machines).fail(function (jqXHR, textStatus, errorThrown) { 
     self.errorText('refreshMachines() : ' + textStatus + ' : ' + errorThrown); 
    }); 

    $.when(paramsPromise, machinesPromise).always(function() { 
     self.busy(false); 
    }); 
}; 
+0

Mais que missuses totalement l'enchaînement/tuyauterie de promesses. Je pourrais faire ce genre de code en utilisant des rappels normaux. –

+0

"... abuse totalement ..."?!?!? Pour en revenir à votre phrase d'ouverture, je dois convenir que vous avez probablement mal compris comment $ .Deferred fonctionne. Vous avez demandé conseil, vous en avez reçu et vous l'avez méprisé à fond. Si vous ne voulez pas d'aide, ne postez pas de questions. –

+0

Je peux voir comment mon commentaire pourrait être sorti impoli, je suis désolé à ce sujet. Merci beaucoup pour l'aide, je l'apprécie beaucoup. Je suis juste frustré après avoir essayé de comprendre cela toute la journée. Je voulais juste dire par erreur que ça casse l'idée de chaîner si vous devez définir et gérer les erreurs et les réponses de tous les appels. –

Questions connexes