让 jquery jqxhr 像已经在发送请求一样

Make jquery jqxhr act like already sending request

本文关键字:请求 一样 jqxhr jquery      更新时间:2023-09-26

>我有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);
            }
        };

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

我已经尝试过这种方式如何愚弄 jqXHR 以始终成功但它没有多大帮助

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

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

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

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