【问题标题】:Make jquery jqxhr act like already sending request使 jquery jqxhr 像已经发送请求一样
【发布时间】:2014-12-23 22:45:45
【问题描述】:

我有 SendRequest 对象,并且该类具有类似

的功能
        request: function(args)
        {
           return $.ajax.apply(null, args);
        };

然后很多类使用 SendRequest 对象来获取服务器响应

        var prom = SendRequest.request(
            {
                type: 'GET',
                url: _this.uri 
            });

        return $.when(prom).done(function(response)
            {
                 .... do something 
            });

我的目标是在 SendRequest.request 中需要先检查 window.localStorage。 是否已经有值,如果之前没有值则发送请求。 否则,如果 localStorage 上已经有值,则返回 $.ajax() 对象之前保存的值。

        request: function(args)
        {
            var ls = window.localStorage;
            var savedResponse = ls.getItem(args.url);
            if (savedResponse !=== null)
            {
               var result = $.ajax();
               result.responseText = savedResponse;
               result.readyState = 4;
               result.status = 'OK';
               return result;
            }
            else
            {
               return $.ajax.apply(null, args);
            }
        };

但不幸的是它没有工作:( 我一直在寻找,但找不到像我这样的案例

我已经尝试过这种方式 how to fool jqXHR to succeed always 但它没有多大帮助

【问题讨论】:

  • 接近投票者 - 恕我直言,这个问题是完全清楚的。

标签: javascript jquery


【解决方案1】:

这不起作用的原因是,尽管您创建了一个假的 jqXHR 对象,它是来自 $.ajax 的响应,但该对象实际上并不是提供给 .done 回调的参数 - 它实际上是第三个参数。

另外,恕我直言,您不应该真正使用$.when 来“承诺”单个非承诺对象。它旨在处理多个 Promise 之间的同步,而将每个非 Promise 包装成一个新 Promise 的事实只是一个副作用。

相反,您应该使用适当的数据创建一个已经“解决”的新承诺:

if (savedResponse != null) {
    return $.Deferred(function() {
        // retrieve relevant fields from localStorage
        ...
        this.resolve([data, textStatus, jqXHR]); 
    }).promise();
} else {
    // perform real AJAX request
    return $.ajax.apply($, args);
}

或者,考虑只记住返回数据本身(用于成功调用),而不是整个响应三元组。

您还可以找到我在 jQuery UK 2013 上的演示文稿 - http://www.slideshare.net/RayBellis/memoizing-withindexeddb

【讨论】:

  • 谢谢@Alnitak先生,它对我的​​帮助很大:)
猜你喜欢
  • 2017-07-10
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2013-03-26
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多