2013-06-05 2 views
0

У меня есть функция javascript/ajax, которая ищет файл json, размещенный на другом сервере. Мне нужна моя функция, чтобы выполнить следующие действия:Как использовать Ajax для сохранения файла кэша?

  1. Получить JSon файл с внешнего сервера
  2. Сохранить JSon файл на своем локальном сервере
  3. Проверьте, чтобы увидеть, если JSON файл старше 1 час
  4. Если оно не старше 1hr затем использовать эти данные
  5. Если он старше 1hr - повторно загрузить с внешнего сервера и перезаписать локальную версию

В настоящее время моя функция получает данные от внешнего терминала каждый раз, когда он вызывается. Мне нужно добавить в эту функцию кеширования, но я не уверен, как ее использовать.

Может ли кто-нибудь предложить какие-либо рекомендации?

Вот мой код:

 function ajaxLoad(page,url,type,variety,category , widgetClickedId) 
     {   

      /* 
      * Checking the clicked id is the same as passed in one 
      * TODO refactor so the clicked id only ever gets passed 
      */ 
      if(widgetId != widgetClickedId && widgetClickedId != undefined) 
      { 
       return false; 
      } 

      var website = $('#button-print'+widgetId).data("website");   
      var page = $('#button-print'+widgetId).data("page"); 


      $.ajax({ 
       type: 'GET',     
       url: 'www.myothersite.com/api/v1/productchoice.json?website='+website, 
       async: true, 
       jsonp: 'callback', 
       dataType: 'jsonp', 
       success: function(productchoice) 
       { 

        if(productchoice['brand'+widgetId] == 'null' || productchoice['brand'+widgetId] == undefined) 
        { 
         productchoice['brand'+widgetId] = ''; 
        } 
        //check that all values are not null , if not , then show the widget      
        if(  productchoice['brand'+widgetId] == ''          
          && productchoice['subject'+widgetId] == '' 
          && productchoice['market'+widgetId] == '' 
          && productchoice['type'+widgetId] == '' 
          && productchoice['bookazinebrands'+widgetId] == '') 
        {      

         //is this corect?       
         $('#gdmContainer'+widgetId).hide(); 
         //return false; 
        } 
        else 
        {     
         $('#gdmContainer'+widgetId).show();       
        } 

        setRibbons(productchoice.ribbonTop , productchoice.ribbonBottom); 
        getProductChoice(productchoice);  
        setLoveTitle(productchoice); 
        setDefaultBtn(productchoice['defaultBtn'+widgetId]);      
        return productchoice; 
       }    
      });  

Заранее спасибо!

ответ

0

Все, что вам нужно сделать, это создать объект javascript с данными, которые возвращаются из запроса Ajax. Как часть этого объекта, сохраните дату, когда объект был кэширован. Затем вы можете сравнить эту дату с текущим временем при каждом вызове функции.

Вот как я мог бы решить эту:

 // Variable to contain cached object. Make sure it name it better... 
    var x = null; 

    function ajaxLoad(page, url, type, variety,category, widgetClickedId) 
    { 
     /* 
     * Checking the clicked id is the same as passed in one 
     * TODO refactor so the clicked id only ever gets passed 
     */ 
     if(widgetId != widgetClickedId && widgetClickedId != undefined) 
     { 
      return false; 
     } 

     var website = $('#button-print'+widgetId).data("website");   
     var page = $('#button-print'+widgetId).data("page"); 

     // Creating a new date and adding an hour to it. 
     var d = new Date(); 
     d.setHours(d.getHours() + 1); 

     // Test to ensure x is not null and it's not older than an hour old 
     if (x != null && Date.parse(x.date) < d) { 
      // Do your stuff with the cached file here 
     } 
     else { 
      $.ajax({ 
       // set up your ajax request 
       ... 
       success: function (productchoice) { 
        // Make sure to cache the object 
        x.file = productchoice; 
        x.date = new Date(); 

        // Do your stuff with the cached file here 
       } 
      }); 
     } 
    } 

Было бы полезно, чтобы положить ваши нормальные «успех» операции в отдельной функции, чтобы избежать повторения кода. Если вы сделаете это, вы будете использовать кешированную переменную (x в примере кода) вместо использования переменной productchoice (то есть x.file['brand' + widgetId]).

Смежные вопросы