首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录中的速率限制函数调用

类型记录中的速率限制函数调用
EN

Stack Overflow用户
提问于 2016-06-01 15:55:38
回答 3查看 3.5K关注 0票数 2

更新:我现在知道节流阀会减少过多的函数调用,所以它不是正确的工具。我仍然希望采用一种惯用的方式来处理队列中的所有项目,而不需要太快地执行或删除任何项。

我正在编写一个节点应用程序,它的访问API有一个速率限制。我可以比我被允许发送的速度快得多。我想使用一个队列的呼叫,但不要走得太快或放弃任何一个。我做了一个小的类型脚本测试来说明我的问题:

代码语言:javascript
复制
import * as _ from "lodash";

let start = new Date().getTime();

function doLog(s: string) {
  let elapsed = new Date().getTime() - start;
  console.log(`${s} ${elapsed}`);
}

let array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
let throttled = _.throttle(doLog, 100);
array.forEach(s => throttled(s));

我希望看到的输出大致如下:

代码语言:javascript
复制
a 2
b 101
c 203
d 302
e 405
f 502
g 603
h 706
i 804
j 902

但我看到的是:

代码语言:javascript
复制
a 2
j 101

我做了一些奇怪的观察:

  • 在100 20节流阀下,数组的大小似乎无关紧要:我将打印数组中的第一个和最后一个项目,不管它有2个元素还是20个元素。
  • 在1ms节流阀处,我从数组的前面打印3-6个元素,最后一个元素。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-01 18:05:00

如果您不关心在调用下一个doLog()之前安全地“完成”,则只需使用setTimeout

代码语言:javascript
复制
let array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
array.forEach((s, i) => setTimeout(doLog, i*100, s));

Adam很好地解释了为什么throttle在这种情况下不好。

票数 3
EN

Stack Overflow用户

发布于 2016-06-01 17:33:12

如果在等待期间多次调用节流函数,则忽略后续调用。如果您需要处理数组中的每个项,那么throttle()可能不是您想要的。例如,它更适合于防止UI中的过度更新。

您总是在输出中看到aj的原因是由于前缘和后缘。整个数组在不到100 was的时间内被处理,但是由于前导和尾部默认为true,您将看到这两个调用(对节流函数的第一次调用和最后一次调用)。

票数 2
EN

Stack Overflow用户

发布于 2016-06-01 18:00:47

如果您愿意使用RxJS,这个答案会让您非常愚蠢地实现这一点:

https://stackoverflow.com/a/31855054/553003

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37573521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档