javascript - 如何避免手动缓存返回错误的请求?

标签 javascript jquery module-pattern

我创建了一个模块(遵循 Javascript 的模块模式),它发出 http 请求、缓存并返回结果:

var requestService = (function($) {

    var cache = {};

    var get = function(date) {
        var params = date ? {'date': date} : {};
        return $.getJSON('http://my/url', params, function( result ){});
    };

    var fetchData = function(date) {
        if (!cache[date]) {
            cache[date] = get(date);
        }

        return cache[date].done(function(myData) {
            return new Promise(function(resolve,reject) {
                resolve(myData);
            });
        });
    };

    return {
        fetchData: fetchData
    };
})(jQuery);

我的问题是,即使出现错误(例如:主机暂时无法访问),结果也会被缓存。我不希望这种事发生。

我以为只有请求成功才会调用done()函数,但事实并非如此。我应该添加一个cache[date].fail(),并将其自身设置为null吗?我的意思是:

return cache[date].done(function(myData) {
    return new Promise(function(resolve,reject) {
        resolve(myData);
    });
}).fail(function(myData) {
    cache[date] = null;
    return new Promise(function(resolve,reject) {
        reject(myData);
    });
});

这是我的 requestService 在另一个模块中的调用方式:

requestService.fetchData(myDate).done(function(myData) {
    // code when successful
}).fail(function(d, textStats, error) {
    // error
});

最佳答案

donefail 不支持链接回调结果,您的 return new Promise 绝对没有意义。另外,您似乎正在尝试使用 Promise constructor antipattern 。您的代码所做的只是按原样返回 ajax promise (它可以工作,因为您可以链接到它)。

the results are cached even if there's an error

是的 - 通过存储 promise ,整个请求结果都会被缓存,而不仅仅是在成功的情况下。

Should I add a rejection handler, setting itself to null?

是的,这正是您需要做的:

var requestService = (function($) {
    var cache = {};

    function get(date) {
        var params = date ? {'date': date} : {};
        return $.getJSON('http://my/url', params);
    }

    function fetchData(date) {
        if (!cache[date]) {
            cache[date] = get(date);
            cache[date].fail(function(err) {
                cache[date] = null; // retry next time
            });
        }
        return cache[date];
    }

    return {
        fetchData: fetchData
    };
})(jQuery);

如果您想返回原生 Promise,请使用

function fetchData(date) {
    if (!cache[date]) {
        cache[date] = Promise.resolve(get(date)).catch(function(err) {
            cache[date] = null; // retry next time
            throw err;
        });
    }
    return cache[date];
}

关于javascript - 如何避免手动缓存返回错误的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004517/

相关文章:

jquery - 在 JQuery/Angular JS 中通过拖放创建嵌套条件

jquery - 在保留值为零的 Div 之前添加一个 Div

java - 无法在JSP中获取上传图像文件的完整路径

javascript - HighCharts - 选择事件在图表中标记选择

javascript - Azure 移动服务 : Get Server DateTime and compare it

javascript - jQuery 插件的每个实例如何拥有自己的属性和方法?

JavaScript 设计模式 : how to create sub-module and access parent module private vars and functions

javascript - 揭示模块模式java脚本无法访问变量

javascript - ajax没有返回值

Javascript 让用户选择元素