我有一个去抖动的搜索功能。每次在文本区域触发keyup
事件时都会调用它。
在用户在文本区域中键入时获取结果的想法。
{
search: _.debounce(search, 200),
}
但是,无法保证AFAICT对后端的搜索调用将按照发送的顺序返回(网络延迟,服务器变幻莫测),这意味着结果可能(尽管不太可能)对应于早期的搜索词。 / p>
所以我想在执行搜索时取消(或至少忽略响应)任何正在进行的请求。
我有两个问题:
这是一个需要解决的真正问题吗? (我之前没有看到它解决过),
以下代码是否可以帮助我实现这一目标?
function ignoreStale(fn) {
var latest = 0;
return function() {
var id = ++latest; // increments latest too
return fn.apply(this, arguments)
.then(function(result) {
if (id !== latest) {
throw new Error('Stale callback.');
}
return result;
});
}
}
var callCount = 0;
var o = {
foo: ignoreStale(foo),
};
function foo(val) {
callCount--;
return new Promise(function(resolve, reject) {
setTimeout(resolve.bind(null, val), (5000 + callCount*200));
});
}
function go (val) {
o.foo(val).then(doSomething).catch(error);
}
go('1'); // returns third
go('12'); // returns second
go('123'); // returns first
function error(err) {
document.write(err, '<br/>');
}
function doSomething(val) {
document.write('Doing something:', val, '<br/>');
}
推测可取消的承诺会有所帮助,但我使用的是香草JS。