【发布时间】:2014-04-24 14:58:45
【问题描述】:
我仍然不明白 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(then...),它运行良好。稍后,我只需要获取会话 ID,所以我会做 sessionFactory.sessionID,但它只有在我添加回调函数时才有效(然后......),这是为什么呢?我认为我的全局 JavaScript 对象 oSession 自第一次 HTTP 请求以来已经有数据了。
我想避免编写意大利面条式代码,并使用更对象的方法尽可能保持代码简洁。有可能吗?
【问题讨论】:
标签: ajax angularjs http promise deferred