我打算在AngularJS中创建一个缓存服务器响应数据的服务,这就是我所做的:
function addDataCachingServiceToModule(module) {
module.factory('myDataCaching', function ($q, itemRepository) {
var categoriesWithNewItems = undefined;
function getCategoriesWithNewItems(date) {
var deferred = $q.defer();
if (!categoriesWithNewItems) {
return itemRepository.getCategoriesWithNewItems(date)
.then(function (res) {
if (res.data.Data.Success) {
categoriesWithNewItems = res;
deferred.resolve(res);
} else {
deferred.reject(res);
}
});
} else {
deferred.resolve(categoriesWithNewItems);
}
return deferred.promise;
}
function resetCategoriesWithNewItems() {
categoriesWithNewItems = undefined;
}
return {
getCategoriesWithNewItems: getCategoriesWithNewItems,
resetCategoriesWithNewItems: resetCategoriesWithNewItems
};
});
}
令我震惊的是,虽然这种情况正常,但当我尝试使用它时:
myDataCaching.getCategoriesWithNewItems(date)
.then(function(res2) {
// res2 = undefined here !!!
});
..我得到了undefined
而不是我在deferred.resolve(res);
中传递的数据。
我已调试此内容,并在我的服务中使用有效数据调用第一个deferred.resolve(res);
,但在我的then()
中,我得到了undefined
。
它永远不会通过任何其他resolve()/reject()
来电。
有没有人知道这里有什么问题?
答案 0 :(得分:2)
所以,Anant解决了你遗失的回归问题。让我们来讨论你是如何在第一时间获得它的原因:)
承诺链,您当前的代码有deferred anti pattern,我们宁愿避免。你创造了多余的延期,你不应该这样做。你的生活可以轻松得多:
function addDataCachingServiceToModule(module) {
module.factory('myDataCaching', function ($itemRepository) {
var cats = null; // prefer null for explicit lack
function getCategoriesWithNewItems(date) {
// are we sure we don't want to cache by date?
return cats = (cats || itemRepository.getCategoriesWithNewItems(date))
}
function resetCategoriesWithNewItems() {
categoriesWithNewItems = null;
}
return {
getCategoriesWithNewItems: getCategoriesWithNewItems,
resetCategoriesWithNewItems: resetCategoriesWithNewItems
};
});
}
那么,我们在这里做了什么: