使jquery jqxhr像已经发送请求一样 [英] Make jquery jqxhr act like already sending request

查看:85
本文介绍了使jquery jqxhr像已经发送请求一样的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i have SendRequest object and that class has a function like

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

那么很多类都使用SendRequest对象来获取服务器响应

then a lot of class use SendRequest object to get server response

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

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

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

My goal is in SendRequest.request need to check on window.localStorage first. Whether already has a value or not, if has not any value before then send the request. Otherwise, if already value on localStorage then return $.ajax() object with that saved value before.

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

但不幸的是它没有用:( 我一直在寻找,但找不到像我这样的情况

but unfortunately its did not work :( I've been looking but can not find some case like me

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

I already try this way to how to fool jqXHR to succeed always but its not help much

推荐答案

之所以不起作用,是因为尽管您创建了一个伪造的jqXHR对象,该对象是$.ajax的响应,但该对象却不是实际上是提供给.done回调的参数-它实际上是第三个参数.

The reason this doesn't work is that although you've created a fake jqXHR object that's the response from $.ajax, that object isn't actually the parameter that's supplied to the .done callback - it's actually the third parameter.

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

Also, IMHO you shouldn't really use $.when to "promisify" a single non-promise object. It's intended to handle synchronisation between multiple promises and the fact that it wraps each non-promise into a new promise is just a side effect.

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

Instead, you should create a new promise that is already "resolved" with the appropriate data:

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

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

Alternatively, consider just memoizing the return data itself (for successful calls), not the whole response triple.

您可能还会发现我在jQuery UK 2013上使用过的演示文稿- http://www.slideshare.net/RayBellis/memoizing-withindexeddb

You may also find this presentation that I gave at jQuery UK 2013 of use - http://www.slideshare.net/RayBellis/memoizing-withindexeddb

这篇关于使jquery jqxhr像已经发送请求一样的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆