2017-03-24 7 views
0

내가 (자바 스크립트의 모듈 패턴 다음) 모듈을 만들었습니다오류를 반환 한 요청을 수동으로 캐싱하지 않으려면 어떻게해야합니까? HTTP 요청, 캐시을하고 결과를 반환

var requestService = (function($) { 

    var cache = {}; 

    var get = function(date) { 
     var params = date ? {'date': date} : {}; 
     return $.getJSON('http://my/url', params, function(result){}); 
    }; 

    var fetchData = function(date) { 
     if (!cache[date]) { 
      cache[date] = get(date); 
     } 

     return cache[date].done(function(myData) { 
      return new Promise(function(resolve,reject) { 
       resolve(myData); 
      }); 
     }); 
    }; 

    return { 
     fetchData: fetchData 
    }; 
})(jQuery); 

내 문제는 오류 (예 :이 경우에도 결과가 캐시되는 경우 : 호스트에 일시적으로 도달 할 수 없음). 나는 그런 일이 일어나기를 원하지 않는다.

done() 함수는 요청이 성공한 경우에만 호출 될 것이라고 생각했지만 실제로는 그렇지 않습니다. 캐시 [날짜] .fail()을 추가해야하며 null로 설정되어 있습니까? 나는 무엇을 의미 :

return cache[date].done(function(myData) { 
    return new Promise(function(resolve,reject) { 
     resolve(myData); 
    }); 
}).fail(function(myData) { 
    cache[date] = null; 
    return new Promise(function(resolve,reject) { 
     reject(myData); 
    }); 
}); 

가 여기 내 requestService이 다른 모듈에서 호출되는 방법은 다음과 같습니다

requestService.fetchData(myDate).done(function(myData) { 
    // code when successful 
}).fail(function(d, textStats, error) { 
    // error 
}); 

답변

1

donefail는 체인 콜백 결과를 지원하지 않는, 당신의 return new Promise 절대적으로 무의미하다. 또한 마치 Promise constructor antipattern을 사용하는 것처럼 보입니다. 코드가 그대로 아약스 약속을 그대로 돌려주는 것 (연쇄 할 수있는대로 작동 함).

결과가 오류

예이 경우에도 캐시 - 약속을 저장하여, 전체 요청 결과는 성공의 경우뿐만 아니라, 캐시됩니다.

자체를 null로 설정해야하는 거부 처리기를 추가해야합니까?

그래, 당신이해야 정확히 : 당신이 기본 약속을 반환 할 경우, 최대 머리에 대한

function fetchData(date) { 
    if (!cache[date]) { 
     cache[date] = Promise.resolve(get(date)).catch(function(err) { 
      cache[date] = null; // retry next time 
      throw err; 
     }); 
    } 
    return cache[date]; 
} 
+0

감사를 사용

var requestService = (function($) { var cache = {}; function get(date) { var params = date ? {'date': date} : {}; return $.getJSON('http://my/url', params); } function fetchData(date) { if (!cache[date]) { cache[date] = get(date); cache[date].fail(function(err) { cache[date] = null; // retry next time }); } return cache[date]; } return { fetchData: fetchData }; })(jQuery); 

! 나는 약속 API에 참으로 새롭다,이 부호는 매우 더 청결하다. – Tarek

0

확인 신경 끄시 고, 그 코드는 일부 조정을했다. 내 fetchData 메서드에서 객체가 비어 있는지 (즉, 또는 null이 정의되어 있지 않은지) 확인하고 cache [date]를 무효화하는 fail() 메소드를 추가했습니다. 나는 지금 다음을 수행하십시오

var requestService = (function($) { 

    var cache = {}; 

    var get = function(date) { 
     var params = date ? {'date': date} : {}; 
     return $.getJSON('http://my/url', params, function(result){}); 
    }; 

    var fetchData = function(date) { 
     // now also checks for null 
     if ($.isEmptyObject(cache[date])) { 
      cache[date] = get(date); 
     } 

     return cache[date].done(function(myData) { 
      return new Promise(function(resolve,reject) { 
       resolve(myData); 
      }); 
     }).fail(function(myData) { 
     return new Promise(function(resolve,reject) { 
      // nullifies cache[date] 
      cache[date] = null; 
      reject(myData); 
     }); 
    }; 

    return { 
     fetchData: fetchData 
    }; 
})(jQuery);