bei der Verwendung von $q.defer() in Angularjs
Ich bin neu in Angularjs und ich bin nach diesem tutorial :http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.WE70iubhCM8 . Aber ich verstehe nicht, Wann $q.defer(). Zum Beispiel in der folgenden Angularjs-code, warum verwenden Sie "$q".defer() :
function login(username, password) {
//create a new instance of deferred
var deferred = $q.defer();
//send a post request to the server
$http.post('/user/login',
{username: username, password: password})
//handle success
.success(function (data, status) {
if(status === 200 && data.status){
user = true;
deferred.resolve();
} else {
user = false;
deferred.reject();
}
})
//handle error
.error(function (data) {
user = false;
deferred.reject();
});
Den server-side-code ist :
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(401).json({
err: info
});
}
req.logIn(user, function(err) {
if (err) {
return res.status(500).json({
err: 'Could not log in user'
});
}
res.status(200).json({
status: 'Login successful!'
});
});
})(req, res, next);
});
Und warum nicht verwenden Sie es in der folgenden Angularjs-code :
function getUserStatus() {
return $http.get('/user/status')
//handle success
.success(function (data) {
if(data.status){
user = true;
} else {
user = false;
}
})
//handle error
.error(function (data) {
user = false;
});
}
Server-side-code ist :
router.get('/status', function(req, res) {
if (!req.isAuthenticated()) {
return res.status(200).json({
status: false
});
}
res.status(200).json({
status: true
});
});
Fast verwenden Sie nie! Nicht aus diesem Beispiel lernen, es setzt ein weithin bekannter antipattern.
InformationsquelleAutor juliana Morales | 2016-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach ausgedrückt, kann man verwenden, $q.defer() erstellt ein Versprechen. Ein Versprechen ist ein Funktion, die einen einzelnen Wert zurückgibt, oder ein Fehler in der Zukunft. Also, wenn Sie haben einige asynchroner Prozess, der sollte einen Rückgabewert oder ein Fehler, können Sie die $q.defer() zum erstellen einer neuen Versprechen.
In den meisten Fällen jedoch, Eckig hat dies bereits getan für Sie und Sie können einfach verwenden Sie die Versprechen, die zurückgegeben wird, zum Beispiel durch den $http-service. Ihr Beispiel zeigt ein gutes Beispiel, wenn Sie wollen, die Erstellung Ihrer eigenen.
Sehen Sie, in der Regel den $http-Dienst zurückgibt, wird der Wert aus der server, oder eine Fehlermeldung, wenn der http-Aufruf fehlschlägt. In Ihrem Beispiel, aber Sie wollen auch einen Fehler zurück, von der Verheißung (= ablehnen), wenn der http-Aufruf selbst Erfolg, hat aber eine nicht-true-Wert für den
success
Eigenschaft.Dazu das folgende Beispiel erstellt ein neues Versprechen, deren Rückgabewert (oder Fehler) können dann manuell gesteuert werden. In diesem Beispiel wird durch den Aufruf der
resolve()
(= Wert) funktionieren nur, wenn die http-Aufruf ist erfolgreich und hatdata.success == true
. In allen anderen Fällen (wenn der http-Aufruf fehlschlägt oder nicht die richtigen Daten.status-Wert) der neu erstellte Versprechen abgelehnt wird (= Fehler zurückgeben).InformationsquelleAutor Robba
$q.defer()
können Sie erstellen ein promise-Objekt, die Sie zurück zu der Funktion, die aufgerufen, Ihrelogin
Funktion.Stellen Sie sicher, dass Sie zurück
deferred.promise
anstatt das gesamtedeferred
Objekts, so dass nur die Funktion, die erstellt Ihr deferred-Objekt aufrufen könnenresolve()
oderreject()
auf, aber die aufrufende Funktionlogin
können noch warten, bis das Versprechen erfüllt werden. Sinn?InformationsquelleAutor J-DawG