我试图找出我应该怎么避免我的代码,这种竞争情况:如何避免这种竞争条件?
.factory('cartFactory', function ($rootScope, Restangular, $q) {
var cart = {items: false};
var response = false;
return {
cart: cart,
get: function ($cart) {
var deferred = $q.defer();
if (!cart.items) {
cart.items = true;
if (!response) {
//get items async
//simulated with $timeout
Restangular.oneUrl('cart_show', Routing.generate('en__RG__myapp.api.cart.show')).get().then(function ($response) {
response = $response;
deferred.resolve(response);
});
} else {
//resolve promise with already loaded items
deferred.resolve(response);
}
deferred.promise.then(function ($response) {
angular.copy($response.cart, cart);
angular.copy($response.cart, $cart);
});
} else {
angular.copy(cart, $cart);
}
return deferred.promise;
},
set: function ($cart) {
angular.copy($cart, cart);
}
}
})
我想要做的是,如果我叫cartFactory.get($车)两次,然后阿贾克斯请求应该只发送一次,我第二次调用它,然后如果ajax被加载,那么它应该承诺在响应完全加载时分配内容。
谢谢迈克尔,很好的方式。我认为restangular使用$ http,并且可以这样配置。只是在这里我可能不想缓存这种方式,我想决定什么时候缓存(因为这是一个请求购物车的内容,我可能想在某个时候再次发送一个新的请求)。我认为我的问题不清楚(当然这是我的错),我更关心如何在这里正确使用诺言。正如你在我的代码中看到的,我正在检查响应,这是不正确的,因为只有在请求完成时才会分配响应。 – mr1031011
你是不是指这部分angular.copy($ response.cart,cart);在你的promis然后功能? – michael
感谢迈克尔,你指出我正确的方向,我只是很混淆诺言thingy(显然仍然困惑)。我发布了适用于我的更新代码。 – mr1031011