我仍然不了解Promise API的工作原理。我想知道是否有办法在我需要的时候获取数据而无需调用多个HTTP请求。这是一个例子:
会话服务: 它所做的只是获取会话对象(包含数据)或获取返回数字的会话ID。
app.factory('sessionFactory', ['$resource', 'requestFactory',
function ($resource, requestFactory) {
var oSession = {};
var session = {
/**
* Get session ID
* @return {Number}
*/
sessionID: function () {
if (typeof oSession.id !== "undefined") {
return oSession.id;
} else {
return requestFactory.getObject('/application/current_session').then(function (response) {
oSession = response;
return oSession.id;
});
}
},
/**
* Get session object (GET)
* @return {Object} data in JSON format
*/
getCurrentSession: function () {
if (!oSession.id) {
return requestFactory.getObject('/application/current_session').then(function (response) {
oSession = response;
return oSession;
});
}
}
};
return session;
}]);
请求HTTP服务: 此服务仅执行HTTP请求。
app.factory('requestFactory', ['$http', '$q', '$timeout',
function ($http, $q, $timeout) {
return {
getObject: function (jsonURL, params) {
// $q service object
var deferred = $q.defer();
// regular ajax request
$http({
method: 'GET',
url: jsonURL,
params: params
})
.success(function (result, status, headers, config) {
// promise resolve
deferred.resolve(result);
})
.error(function (result, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
deferred.reject('Erreur request : ' + status);
});
return deferred.promise;
}
};
}]);
因此,为了获得我的Session对象,我使用回调函数(然后......)执行sessionFactory.getCurrentSession,它完美无缺。稍后,我只需要获取会话ID,所以我会做sessionFactory.sessionID,但它只有在我添加回调函数(然后......)时才有效,为什么会这样?我认为自第一个HTTP请求以来,我的全局JavaScript对象oSession已经拥有数据。
我想防止做一个意大利面条代码并尽可能保持代码干净,采用更多对象方法。有可能吗?
答案 0 :(得分:0)
看起来你正试图用promise API做太多。它已经内置在$ http服务中,因此您不需要自己调用它。试试这个:
app.factory('requestFactory', ['$http',
function ($http) {
return {
getObject: function (jsonURL, params) {
// regular ajax request
return $http({
method: 'GET',
url: jsonURL,
params: params
})
.success(function (result, status, headers, config) {
return result;
})
.error(function (result, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
throw new Error('Erreur request : ' + status);
});
}
};
}]);
通过返回$ http调用的结果,您实际上是在返回一个promise。然后,您可以将其他分辨率代码链接到返回值。请参阅$q documentation的“链接承诺”部分。
答案 1 :(得分:0)
如果您想缓存之前的http响应,以便它不会再次进行http调用
bower安装angular-cached-resource
angular.module('对myApp' [' ngCachedResource'])
而不是$resource
使用$cachedResource
,它会将网络调用缓存到本地存储,每次进行调用时它都会立即解析,即使它调用后端并更新缓存。
您还可以使用angular-cache它将缓存您可以设置超时的所有http get调用,并在其配置中排除url
bower install angular-cache