Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit c585a78

Browse files
committed
Make $login return a promise, fixes #175
1 parent 56dad61 commit c585a78

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

angularfire.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,8 @@ AngularFire.prototype = {
431431
// Defines the `$firebaseAuth` service that provides authentication support
432432
// for AngularFire.
433433
angular.module("firebase").factory("$firebaseAuth", [
434-
"$timeout", "$injector", "$rootScope", "$location",
435-
function($t, $i, $rs, $l) {
434+
"$q", "$timeout", "$injector", "$rootScope", "$location",
435+
function($q, $t, $i, $rs, $l) {
436436
// The factory returns an object containing the authentication state
437437
// of the current user. This service takes 2 arguments:
438438
//
@@ -460,13 +460,14 @@ angular.module("firebase").factory("$firebaseAuth", [
460460
// The returned object will also have the following methods available:
461461
// $login(), $logout() and $createUser().
462462
return function(ref, options) {
463-
var auth = new AngularFireAuth($t, $i, $rs, $l, ref, options);
463+
var auth = new AngularFireAuth($q, $t, $i, $rs, $l, ref, options);
464464
return auth.construct();
465465
};
466466
}
467467
]);
468468

469-
AngularFireAuth = function($t, $i, $rs, $l, ref, options) {
469+
AngularFireAuth = function($q, $t, $i, $rs, $l, ref, options) {
470+
this._q = $q;
470471
this._timeout = $t;
471472
this._injector = $i;
472473
this._location = $l;
@@ -534,8 +535,16 @@ AngularFireAuth.prototype = {
534535
var client = new FirebaseSimpleLogin(self._fRef, function(err, user) {
535536
self._cb(err, user);
536537
if (err) {
538+
if (self._deferred) {
539+
self._deferred.reject(err);
540+
self._deferred = null;
541+
}
537542
self._rootScope.$broadcast("$firebaseAuth:error", err);
538543
} else if (user) {
544+
if (self._deferred) {
545+
self._deferred.resolve(user);
546+
self._deferred = null;
547+
}
539548
self._loggedIn(user);
540549
} else {
541550
self._loggedOut();
@@ -548,9 +557,12 @@ AngularFireAuth.prototype = {
548557

549558
// The login method takes a provider (for Simple Login) or a token
550559
// (for Custom Login) and authenticates the Firebase URL with which
551-
// the service was initialized.
560+
// the service was initialized. This method returns a promise, which will
561+
// be resolved when the login succeeds (and rejected when an error occurs).
552562
login: function(tokenOrProvider, options) {
553563
var self = this;
564+
var deferred = self._q.defer();
565+
554566
switch (tokenOrProvider) {
555567
case "github":
556568
case "persona":
@@ -560,8 +572,10 @@ AngularFireAuth.prototype = {
560572
case "anonymous":
561573
if (!self._authClient) {
562574
var err = new Error("Simple Login not initialized");
575+
deferred.reject(err);
563576
self._rootScope.$broadcast("$firebaseAuth:error", err);
564577
} else {
578+
self._deferred = deferred;
565579
self._authClient.login(tokenOrProvider, options);
566580
}
567581
break;
@@ -572,15 +586,20 @@ AngularFireAuth.prototype = {
572586
var claims = self._deconstructJWT(tokenOrProvider);
573587
self._fRef.auth(tokenOrProvider, function(err) {
574588
if (err) {
589+
deferred.reject(err);
575590
self._rootScope.$broadcast("$firebaseAuth:error", err);
576591
} else {
592+
self._deferred = deferred;
577593
self._loggedIn(claims);
578594
}
579595
});
580596
} catch(e) {
597+
deferred.reject(e);
581598
self._rootScope.$broadcast("$firebaseAuth:error", e);
582599
}
583600
}
601+
602+
return deferred.promise;
584603
},
585604

586605
// Unauthenticate the Firebase reference.

angularfire.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)