javascript - 使 jquery jqxhr 的行为就像已经发送请求一样

标签 javascript jquery

我有 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 但这没有多大帮助

最佳答案

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

此外,恕我直言,您不应该真正使用 $.when 来“ promise ”单个非 promise 对象。它的目的是处理多个 Promise 之间的同步,而它将每个非 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

关于javascript - 使 jquery jqxhr 的行为就像已经发送请求一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27620885/

相关文章:

javascript - 具有 "show/hide"功能的 2 列布局,文本渗入第二列。

javascript - 通过设置 width=0 隐藏容器,但有时容器内的一些元素在容器隐藏后会短暂地保持可见

javascript - x = {} 创建自发对象

javascript - VBA 提取 HTML CDATA

javascript - 修改li :after from content script

jquery - 使用 jQuery 动态添加和删除行

javascript - 带有冒泡 Action 的 Ember 单元测试组件

JavaScript 'keyup' 和 'keydown' 事件监听器只触发一次

javascript - 如何使用 jQuery 选择所有复选框?

javascript - CSS 文本 chop 垂直对齐