AngularJS-将HTTP和自定义承诺与递归混合

AngularJS-将HTTP和自定义承诺与递归混合,angularjs,Angularjs,我编写了一个函数包装器,它返回HTTP响应的缓存值。在特定情况下(以注释/标记),无需使用$q.defer创建新的承诺。承诺的方法已返回承诺 function cache_or_http(url,key) { ̶v̶a̶r̶ ̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶ ̲r̲e̲t̲u̲r̲n̲ localforage.getItem(key) .then (function(data) { if (data) { // exists

我编写了一个函数包装器,它返回HTTP响应的缓存值。在特定情况下(以注释
/标记),无需使用
$q.defer
创建新的承诺。承诺的
方法已返回承诺

function cache_or_http(url,key) {
    ̶v̶a̶r̶ ̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
    ̲r̲e̲t̲u̲r̲n̲ localforage.getItem(key)
    .then (function(data) {
         if (data) { // exists
            if (has_expired(data.created_at)) {
                ̲r̲e̲t̲u̲r̲n̲ localforage.removeItem(key)
                .then (function() {return cache_or_http(url,key);}) // <--HERE
                .catch(function() {return do_error_handling();})
            } else { // not expired
                 ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶J̶S̶O̶N̶.̶p̶a̶r̶s̶e̶(̶d̶a̶t̶a̶.̶v̶a̶l̶u̶e̶)̶)̶;̶ 
                 return JSON.parse(data.value);
            }
         } else {
            // doesn't exist
            return $http.get(url)
            .then (function(data) {
                cache_entry = {
                    'value': JSON.stringify(data),
                    'created_at': moment().toString()
                };
                ̲r̲e̲t̲u̲r̲n̲ localforage.setItem(key, cache_entry);
                ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶d̶a̶t̶a̶)̶;̶
                ̶r̶e̶t̶u̶r̶n̶ ̶(̶d̶.̶p̶r̶o̶m̶i̶s̶e̶)̶;̶
            });
         } // doesn't exist
    }); // getItem .then
    ̶r̶e̶t̶u̶r̶n̶ ̶(̶d̶.̶p̶r̶o̶m̶i̶s̶e̶)̶;̶
 }
函数缓存\u或\u http(url,键){
̶v̶a̶r̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶82
̲r̲e̲t̲u̲r̲n̲localfough.getItem(键)
.then(功能(数据){
如果(数据){//存在
如果(已过期(数据创建时间)){
̲r̲e̲t̲u̲r̲n̲localfound.removietem(键)

.then(function(){return cache_或_http(url,key);})//谢谢。我知道我是在不必要地包装额外的承诺。就我的理解而言,抛开关于额外包装的部分,我的代码是否有错误?我还在原始代码中添加了一个小if情况(没有缓存设置)这让我更加困惑-我想在这种情况下,我确实需要我自己的承诺包装器?好吧,我用你的建议写了一个提琴-似乎很好,但在我自己的代码中,我面临着问题。我需要更深入地了解正在发生的事情。谢谢。发现问题-在我的代码中,与你的建议无关。我需要确保第一个lin吗函数中的e是一个return?请看我修改过的代码。它可以工作,但我已经阅读了整个代码,应该用return包装。
function cache_or_http(url,key) {
    ̶v̶a̶r̶ ̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
    ̲r̲e̲t̲u̲r̲n̲ localforage.getItem(key)
    .then (function(data) {
         if (data) { // exists
            if (has_expired(data.created_at)) {
                ̲r̲e̲t̲u̲r̲n̲ localforage.removeItem(key)
                .then (function() {return cache_or_http(url,key);}) // <--HERE
                .catch(function() {return do_error_handling();})
            } else { // not expired
                 ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶J̶S̶O̶N̶.̶p̶a̶r̶s̶e̶(̶d̶a̶t̶a̶.̶v̶a̶l̶u̶e̶)̶)̶;̶ 
                 return JSON.parse(data.value);
            }
         } else {
            // doesn't exist
            return $http.get(url)
            .then (function(data) {
                cache_entry = {
                    'value': JSON.stringify(data),
                    'created_at': moment().toString()
                };
                ̲r̲e̲t̲u̲r̲n̲ localforage.setItem(key, cache_entry);
                ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶d̶a̶t̶a̶)̶;̶
                ̶r̶e̶t̶u̶r̶n̶ ̶(̶d̶.̶p̶r̶o̶m̶i̶s̶e̶)̶;̶
            });
         } // doesn't exist
    }); // getItem .then
    ̶r̶e̶t̶u̶r̶n̶ ̶(̶d̶.̶p̶r̶o̶m̶i̶s̶e̶)̶;̶
 }