AngularJS promise以错误的值解析

时间:2014-09-22 09:43:34

标签: angularjs promise

我打算在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()来电。

有没有人知道这里有什么问题?

1 个答案:

答案 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
    };
});
}

那么,我们在这里做了什么:

  • 缓存承诺而不是值以避免竞争条件。在原始版本中,在返回第一个请求之前发出多个请求,然后多次更新缓存,这会使删除无效。
  • 避免创建超额延迟,这也更快更清洁。