【问题标题】:Issue with Lodash Throttle or Debounce within the loop循环内的 Lodash Throttle 或 Debounce 问题
【发布时间】:2019-04-22 13:40:32
【问题描述】:

我正在调用一个获取请求,我试图通过使用 Lodash Throttle 或 Debounce 来限制该请求。我正在遍历一些数组并立即调用函数,这会影响服务器以 502 响应。我正在尝试使用 Throttle 减慢请求。下面的代码应该解释我的结构。这个例子不起作用,我不知道为什么?


    function doSomething(i) {
      console.log('Doing something: ' + i)
    }


    for (var i = 0; i < 50; i++) {

       _.throttle( function() { doSomething(i) }, 15000);

    }

应该每 15 秒调用一次函数 doSomething(),并且应该堆叠对该函数的其他请求。

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    _.throttle() 不应该以这种方式使用。正确的做法是先存储结果。

    var throttledDoStomething = _.throttle(doSomething, 15000)
    
    for (var i=0; i < 50; i++) {
      throttledDoSomething(i)
    }
    

    【讨论】:

    • 我需要堆叠请求并在 5000 中用另一个 'i' 调用 doSomething(i)
    • 然后使用另一个受限制的doSomething
    【解决方案2】:

    回复评论:

    在这种情况下,油门可能不是正确的选择。您可能希望通过 Promise 来使用异步函数。
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

    function asyncDoSomething(i) {
      return new Promise((resolve, reject) => {
        console.log('Doing something: ' + i);
        setTimeout(()=>{
          resolve(i);
        }, 15000)
      })
    }
    
    async function doSomethingLoop() {
      for (var i = 0; i < 50; i++) {
        await asyncDoSomething(i);
      }
    }
    
    doSomethingLoop();
    

    文档建议您应该首先制作节流功能。
    放置参数需要使用匿名函数(在我的例子中,我使用了数组函数)。

    function doSomething(i) {
      console.log("Doing something: " + i);
    }
    
    const throttledSomething = _.throttle(() => { doSomething(i)}, 5000);
    
    for (var i = 0; i < 50; i++) {
      throttledSomething(i);
    }
    

    【讨论】:

    • 如果我这样做,我只会点击 0 和 50,而介于两者之间的所有内容都将被跳过:jsbin.com/xarubanoqe/2/edit?js,console
    • 我需要堆叠请求并在 5000 中用另一个 'i' 调用 doSomething(i)
    猜你喜欢
    • 2018-09-27
    • 2018-04-12
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2019-04-08
    • 2015-05-21
    • 2017-06-24
    相关资源
    最近更新 更多