我创建了一个模块(遵循 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
});
最佳答案
done
和 fail
不支持链接回调结果,您的 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/