2012-06-01 12 views
12

Ich habe ein $.ajax Versprechen und möchte überprüfen, ob meine (syntaktisch gültige) Antwort einen Fehler enthält, der in diesem Fall den abgelehnten Status auslöst.Einen Fehler in das verzögerte Objekt von jQuery werfen

Ich habe mit meiner eigenen Versprechens-Bibliothek gearbeitet, die solche Aufgaben leicht erledigt. Ich mag jQuerys Promise (cache) Implementierung mit seinem Deferred object nicht wirklich und kann etwas übersehen haben, weil ich es selten benutze. Ich denke, der Weg zu gehen ist nur .then() verwenden, das ziemlich kompliziert zu sein scheint:

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

Dies sollte ein Versprechen zurück, die im Fall von Netzwerkfehlern oder Problemen mit der Antwort abgelehnt wird. Aber ist die Zurückweisung eines zurückgewiesenen wirklich der [einzige | beste | kürzeste] Weg zu gehen?

Ich würde auch Hilfe, wie man mit solchen "Fehler werfen Antwort-Handler" in den Ajax-Optionen selbst behandelt, konnte ich keine gute Dokumentation über sie finden.


Haftungsausschluss: Nein, ich kann nicht die Serverantworten ändern. Das Problem erkennende Verfahren ist synchron. Ich möchte keine anderen Bibliotheken verwenden, ich bin besonders daran interessiert, wie jQuery das löst.

+0

OK, mit '.then()' ich das Ding bedeutete, dass '.pipe()' tut in jQuery :-( – Bergi

+0

ab Jquery 1.8 pipe === dann – Plynx

+0

Ja, Gott sei Dank haben sie wenigstens das behoben. – Bergi

Antwort

31

Jetzt für jQuery 1.8+ aktualisiert

Der einfachste Weg, dies zu bekämpfen, um die Reaktion von $.ajax durch .then laufen auf Erfolg oder Misserfolg der Daten filtern basiert.

$.ajax() 
    .then(function (response) { 
     return $.Deferred(function (deferred) { 
      var problem = hasError(response); 

      if (problem) { 
       return deferred.reject(problem) 
      } 

      deferred.resolve(response); 
     }).promise(); 
    }); 

Sie könnten dann wieder diese neue Versprechen an, was auch immer Coderuf diese verbrauchen würde:

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

Was ist der Unterschied zwischen Rohr und dann? – Bergi

+1

Mit 'Pipe' können Sie die Werte eines Deferred-Filters filtern, bevor sie an einen beliebigen registrierten Verspre-Handler gesendet werden. 'then' wird dann nur verwendet, um Handler zu registrieren, wenn ein Versprechen verfällt oder abgelehnt wird. – Eli

+1

Nein, [nach Spezifikation] (http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A) .then() würde genau das tun. Oder hat jQuery das Problem aufgeworfen und Methodennamen getauscht? – Bergi

Verwandte Themen