You could have something like a reqsDeferred
that keeps the service calls pending until it is resolved. login
and getManifest
each check if the other resolved before them, and resolve reqsDeferred
when so:
'use strict';
myApp.factory('MyService', function($http, $q, ManifestService){
var manifest = null;
var authenticationToken = null;
// [1] Create the deferred requirements object
reqsDeferred = $q.defer();
return {
getAuthenticationToken: function() {
var deferred = $q.defer();
$http.post('/login', authData )
.success(function(data, status, headers, config){
authenticationToken = data.authToken;
deferred.resolve(data.authToken);
//[2] Check for the other to be resolved
if (manifest !== null) {
reqsDeferred.resolve();
}
});
return deferred.promise;
},
getManifest: function() {
var deferred = $q.defer();
$http.post('/manifest', authData )
.success(function(data, status, headers, config){
deferred.resolve(data.manifest);
manifest = data.manifest;
//[2] Check for the other to be resolved
if (authenticationToken !== null) {
reqsDeferred.resolve();
}
});
return deferred.promise;
},
makeServiceCall: function(url, data) {
var deferred = $q.defer();
//[3] Keep the calls pending until the promise is satisfied
reqsDeferred.promise.then( function () {
// use manifest and authtoken here
$http.post(url, authData )
.success(function(data, status, headers, config){
deferred.resolve(data);
});
});
return deferred.promise;
}
}
});