(function() {
"use strict";
angular.module('myApp', ['ui.router', 'ngResource'])
.controller('myController', ['$scope', '$state', '$q', '$timeout', '$resource', '$log', MyController])
.config(['$stateProvider', configUiRouter]);
function configUiRouter($stateProvider) {
$stateProvider
.state("home", {
url: "/home",
template: "<div>Home state</div>"
})
.state("dashboard", {
url: "/dashboard",
template: "<div>Dashboard state</div>"
})
.state("error", {
url: "/error",
template: "<div>Error state: I'm sorry Dave, I'm afraid I can't do that...</div>"
});
}
function MyController($scope, $state, $q, $timeout, $resource, $log) {
$scope.status = {
emailActivated: false,
signinByToken: false,
personalInfo: false,
*Users: null,
loading: null,
counter: 0
};
$state.go('home'); // set default state for ui-router test
activateEmail()
.then(updateStatusLoading).then(counting) // Loading: . Counter: 1
.then(signinByToken)
.then(updateStatusLoading).then(counting) // Loading: .. Counter: 2
.then(setPersonalInfo)
.then(updateStatusLoading).then(counting) // Loading: ... Counter: 3
.then(goToDashboard)
.then(updateStatusLoading).then(counting) // Loading: .... Counter: 4
.then(somethingElse)
.then(triggerError)
.then(neverReached)
.catch(catchesReject);
/* * * * * * * * * * *
* Promise functions *
* * * * * * * * * * */
// doesn't return any promise
// (resolves immediately)
function updateStatusLoading() {
if (!$scope.status.loading) {
$scope.status.loading = "";
}
$scope.status.loading += ".";
}
// returns something other than a promise (a String...)
// (resolves immediately)
function counting() {
$scope.status.counter++;
return "Did some counting... (" + $scope.status.counter + ")";
}
// using promise returned by $timeout
// (delayed resolution)
function activateEmail() {
return $timeout(function simulateActivateEmailLatency() {
$scope.status.emailActivated = true;
}, 1000);
}
// using promise returned by $q.defer, resolved in a $timeout
// (the return is immediate, but the resolve is delayed)
function signinByToken() {
var deferred = $q.defer();
$timeout(function simulateSignInLatency() {
$scope.status.signinByToken = true;
deferred.resolve({
returningSomething: "Is entirely optional"
});
}, 1000);
//log to console what this object looks like
$log.log("deferred.promise: ", deferred.promise);
return deferred.promise;
}
// using promise created by $q.when; no timeout
// (immediate resolution)
function setPersonalInfo() {
$scope.status.personalInfo = true;
$log.log("$q.when: ", $q.when({
foo: "bar"
}));
return $q.when({
returningSomething: "Is entirely optional"
});
}
// using promise created by $state.go
// (will resolve once route has changed; which could include time spent doing ui-router resolves...)
function goToDashboard() {
// yup, this returns a promise!
// https://github.com/angular-ui/ui-router/wiki/Quick-Reference#stategoto--toparams--options
var goPromise = $state.go('dashboard');
$log.log("$state.go: ", goPromise);
return goPromise;
}
// using $promise returned by resource, and adding an .then
// (resolves when the $resource does)
function somethingElse() {
var resourceContainingPromise = $resource('https://api.stackexchange.com/2.2/info')
.get({
site: '*'
});
// (note that it contains a $promise, is not a promise itself)
$log.log("$resource: ", resourceContainingPromise);
return resourceContainingPromise
.$promise
.then(function resourceHandler(results) {
$scope.status.*Users = results.items[0].total_users;
});
}
// returns a rejected promise
// (immediate resolve)
function triggerError() {
var rejectPromise = $q.reject("An error message");
$log.log("$q.reject: ", rejectPromise);
return rejectPromise;
}
// this gets skipped due to .triggerError()
function neverReached() {
$log.error("Shouldn't see this!");
$scope.status.loading += "Never reached!";
}
// this catches the $q.reject and logs the data it passed...
function catchesReject(data) {
$log.log(data); //log the error message
return $state.go('error');
}
}
})();
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.28/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.28/angular-resource.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.14/angular-ui-router.min.js"></script>
<div ng-app="myApp">
<div ng-controller="myController">
<div style="display:inline-block; float:left; margin-right: 20px; min-width: 250px;">
<ul>
<li>Email activated: {{status.emailActivated}}</li>
<li>Sign-in by Token: {{status.signinByToken}}</li>
<li>Personal info set: {{status.personalInfo}}</li>
<li>* Users: {{status.*Users}}</li>
</ul>
<hr />
Loading: {{status.loading}}
<br />Counter: {{status.counter}}
</div>
<div style="display:inline-block; padding: 10px; border: 1px solid grey; max-width: 150px;">
<strong>Ui Router Test</strong>
<div ui-view></div>
</div>
</div>
</div>