Die Muster der Verwendung von Versprechungen verwirren mich immer noch.AngularJS: Sollte die boolesche Methode von service die Antwort zurückgeben, die zu wahr/falsch aufgelöst wird, oder die gelöst/zurückgewiesen wird?
Zum Beispiel habe ich in Angular-Anwendung einen Service usersService
mit Methode emailExists(email)
. Offensichtlich führt es eine Anfrage an den Server durch, um zu überprüfen, ob eine gegebene Email bereits existiert.
Es fühlt sich natürlich für mich an, um die Methode emailExists(email)
zur Rückkehr versprechen, dass im Normalbetrieb entweder true
oder löst. Wenn wir nur etwas unerwarteten Fehler haben (zum Beispiel Server 500: internal server error
zurückgegeben, dann sollten Versprechen abgelehnt werden, aber im Normalbetrieb, wird sie in entsprechenden Booleschen Wert aufgelöst.
Hovewer, wenn ich meine Asynchron-Validator Richtlinie begonnen Umsetzung (von $asyncValidators
), ich sehe, dass es will aufgelöst/abgelehnt Versprechen also, jetzt, ich mit diesem ziemlich hässlich Code endete.
'use strict';
(function(){
angular.module('users')
.directive('emailExistsValidator', emailExistsValidator);
emailExistsValidator.$inject = [ '$q', 'usersService' ];
function emailExistsValidator($q, usersService){
return {
require: 'ngModel',
link : function(scope, element, attrs, ngModel) {
ngModel.$asyncValidators.emailExists = function(modelValue, viewValue){
return usersService.emailExists(viewValue)
.then(
function(email_exists) {
// instead of just returning !email_exists,
// we have to perform conversion from true/false
// to resolved/rejected promise
if (!email_exists){
//-- email does not exist, so, return resolved promise
return $q.when();
} else {
//-- email already exists, so, return rejected promise
return $q.reject();
}
}
);
};
}
}
};
})();
es hat mich denken lässt, dass ich meinen Dienst ändern sollte, so dass es gelöst Rückkehr/abgelehnt Verspreche es stattdessen. Aber es fühlt sich für mich irgendwie unnatürlich an: Meiner Meinung nach bedeutet das abgelehnte Versprechen "wir können kein Ergebnis bekommen ", nicht" negatives Ergebnis ".
Oder missverstehe ich die Verwendung von Versprechen?
Oder sollte ich zwei Methoden bereitstellen? Was ist das übliche Muster, um sie zu benennen?
Jede Hilfe wird geschätzt.
Der Entwurf '$ asyncValidators' scheint verwirrt zu werden, wenn Es erwartet Ausnahmen. – Bergi
Siehe auch [Wann ein Versprechen abzulehnen/aufzulösen] (http://stackoverflow.com/q/17293546/1048572) und [Warum werden Ausnahmen für die Ablehnung von Versprechen in JS verwendet?] (Http://stackoverflow.com/q/21616432/1048572). Ablehnungen sollten außergewöhnlich sein. – Bergi
Versprechen zurückweisen sind Ausnahmen, die goldene Regel besteht darin, Versprechen zu verwenden, wo immer Sie Ausnahmen im synchronen Code verwenden. Würden Sie Ausnahmen verwenden, wenn der Code vollständig synchron ist und IO sofort ausgeführt wird? Wenn Sie Ablehnungen verwenden würden, verwenden Sie andernfalls Werte. –