我有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的事实只是副作用。

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

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/

10-11 13:31