标题略显晦涩,但这里....

我有一个Backbone UI,它在页面加载时对API进行了大量调用。它使用骨干获取缓存来缓存GET请求。在Chrome上,缓存未命中意味着在同一时间对同一个URL执行许多GET请求时,Chrome会导致重复的XHR等待直到第一个XHR完成,然后随后的XHR才到达缓存。

在Firefox中,所有XHR都会立即处理,即使它们是对同一API端点的GET请求。从代码中重构它会很痛苦,所以问题是:

题:

是否存在修补Backbone或jQuery的sync()部分的现有方法,以便在所有浏览器中使用Chrome行为?这样Firefox在处理其他GET请求之前会先等待它?

最佳答案

您可以修改Backbone.ajax以创建请求列表,并在发出后续请求之前等待第一个请求完成。例如

//cached requests
Backbone.xhrs = {};

Backbone.ajax = function(opts) {
    // cache GET requests, not the others
    if (opts.type!=='GET')
        return Backbone.$.ajax.apply(Backbone.$, arguments);

    var xhr;

    // issue the request if a cached version does not exist
    if (!Backbone.xhrs[opts.url]) {
        xhr = Backbone.xhrs[opts.url] = Backbone.$.ajax.call(Backbone.$, opts);
    } else {
        xhr = Backbone.xhrs[opts.url].then(function() {
            return Backbone.$.ajax.call(Backbone.$, opts);
        });
    }

    return xhr;
};


和演示http://jsfiddle.net/nikoshr/vexNP/

09-25 20:30