以下功能是否会实现我忽略过时响应的目标?

时间:2016-07-06 07:43:00

标签: javascript

我有一个去抖动的搜索功能。每次在文本区域触发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。

0 个答案:

没有答案