1

我正在使用一个基本函数来执行 AJAX 请求并获取 JSON:

function getData(endpoint) {
    return $.ajax({
        type: "GET",
        url: endpoint
    });
}

问题是有时端点可能没有响应或需要太多时间来加载数据。在这种情况下,我需要使用从上次调用端点获得的最新 JSON。

我正在寻找一种方法来跟踪 AJAX 响应时间,如果它超过给定的时间限制来使用来自上一个请求的缓存 JSON 响应。

有没有一种优雅的方式来使用 jQuery 呢?

感谢您的任何建议

4

4 回答 4

2

试图用一些示例代码来解释 Anthony Gris 的评论

var lastResponseData;

function getData(endpoint) {
   return $.ajax({
    type: "GET",
    url: endpoint,
    dataType: 'json',
    timeout: 1000,
    error:function(jqxhr, status){
    if(status==="error"){
      if(lastResponseData!=null){
       //use it
      }
    }
    else
    {
    getData(endpoint); try again
    },
    success:function(data){
     lastResponseData=data;
     //do work
    }

    }
 });
}
于 2013-11-08T16:02:01.687 回答
1

变量和延迟对象 + 超时将使这变得容易:

var prevReq = $.Deferred().resolve().promise();

function getData(endpoint) {
    var newReq = $.ajax({
        type: "GET",
        url: endpoint,
        timeout: 2000
    }).then(function(data){
        // successful, set previous request to this request
        prevReq = newReq;
        return data;
    },function(){
        // it failed, return the previous successful request
        return prevReq;
    });
    return newReq;
}

getData("1").done(function(data){
    console.log(data);
})

http://jsfiddle.net/Tentonaxe/85HNs/2/

于 2013-11-08T16:11:33.917 回答
0

您应该具有处理 AJAX 不同结果的功能,但在成功的情况下,您应该将响应存储在全局对象中,并始终从那里获取数据,例如:

GlobalObj = {};
GlobalObj.response = {};

function getData(endpoint) {
    var data;
    $.ajax({
        type: "GET",
        url: endpoint
   })
   .done(function(){ 
   //store in global object
   })
   .fail(function(){})
   .always( function(){
        data = GlobalObj.response;
        //these methods are asyncronous 
        //here you should assing the value instead of returning
   });
}
于 2013-11-08T15:54:01.707 回答
0

您可以在浏览器 cookie 中保存您的最后回复。

看看jQuery cookie

于 2013-11-08T16:01:19.847 回答