【问题标题】:Debounce and return去抖动和返回
【发布时间】:2019-03-20 17:09:28
【问题描述】:

我对这段代码有疑问:

function aFunction(){
  ....
    var deferred = $q.defer();
    debounce(function () {
       deferred.resolve(service.subscribe0(data));
    }, 350);
  return deferred.promise;
}

返回的承诺永远不会被解决。 Debounce 函数是一个第三方函数,从 NPM 有很多下载,所以我可以确定它可以工作。

可能是因为 return 语句“删除”了函数的范围吗?我怎样才能避免这种情况并解决承诺?

【问题讨论】:

  • so I can be sure it works - 但你能确定你使用正确吗?我们可以吗?到 npm 的链接怎么样
  • 如果这是 lodash debounce,那么它会返回 debounced 函数,但您永远不会调用它或返回它。只能通过调用 debounced 函数来解决承诺
  • 我不明白这个。承诺只解决一次。 Debounce 可防止某些事情发生多次过快。
  • 即使这样也不会阻止网格更频繁地触发。您必须对 aFunction 进行去抖动,以便滚动网格不会触发数百个 ajax 调用。正如所写的那样,你解除了承诺决议,这只会发生一次。对 aFunction 的每次调用仍将创建一个新的去抖动函数,与其他函数分开,因此将进行数据调用。

标签: javascript scope promise debouncing


【解决方案1】:

你误解了debounce() 的作用。

debounce() 是一个接受一个函数,并返回一个函数的函数。返回的函数只会在 N 毫秒静默后才调用传递的回调(也就是说,如果你顺序非常快地调用去抖动的函数,只有最后一次调用才会生效,时间过去后)。

debounce() 本身不会调用您传递给它的函数。所以,deferred.resolve() 永远不会被调用。

【讨论】:

    【解决方案2】:

    我希望是这样的:

    const getData = data => Promise.resolve( service.subscribe0( data ));
    grid.addEventListener( 'scroll', debounce( getData, 350 ));
    

    我们希望网格在滚动时自行更新,但要对其进行去抖动,这样它就不会因调用而淹没服务。所以我们必须去抖动绑定到滚动而不是数据调用的函数,因为两个不同的数据调用之间没有链接。

    【讨论】:

    • 这并不容易,它是一个框架。无论如何,我以类似的方式解决了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2015-06-02
    • 2015-11-10
    • 1970-01-01
    • 2021-10-26
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多