我試圖找出我應該怎麼避免我的代碼,這種競爭情況:如何避免這種競爭條件?
.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