2016-06-01 5 views
2

更新:スロットルが過剰な関数呼び出しを削除することがわかったので、正しいツールではありません。あまりにも速く行ったり、アイテムを削除したりせずに、キュー内のすべてのアイテムを処理するという慣用的なやり方はまだ好きです。速度制限関数がTypescriptを呼び出す


レート制限付きのAPIに当たるノードアプリケーションを作成しています。私はそれらを送ることが許されているよりもずっと早くコールを作ることができます。私はコールの待ち行列を消費したいですが、あまりにも速く行ったり、それらのいずれかをドロップすることなく。私は自分の悩みを説明するために、小さなtypscriptテストを行った:

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)); 

私はおおよそのような出力を見ると期待:

a 2 
b 101 
c 203 
d 302 
e 405 
f 502 
g 603 
h 706 
i 804 
j 902 

しかし、その代わりに、私は以下を参照してください

a 2 
j 101 

私は」いくつかの奇妙な観察ve製:

  • スロットルが100msのとき、si配列のzeが無関係のように見えます:2つの要素か20かに関係なく、配列の最初と最後の項目を出力します。
  • 1msのスロットルでは、配列の前面から3〜6要素、要素
+0

これは抑制されたものではありません。 [ドキュメント](https://lodash.com/docs#throttle)を参照してください。あなたが望む振る舞いをする独自のクラスを書くことができます...私はそれを処理するためにロダッシュには何もないと思います。 –

+0

私はすでにやりました。私はDavid Corbachoの記事をドキュメントにリンクして読んでいます。ドキュメントには、「抑制された関数には、遅延func呼び出しを取り消すキャンセルメソッドと、即座に呼び出すためのフラッシュメソッドが付属しています。そのフレーズ「遅延ファンクション呼び出し」は、私にキューイングされた呼び出しのように聞こえます...しかし、私は間違っているように聞こえますが、これは問題ありません。私は別の機能/ユーティリティを使用する必要がありますか? –

答えて

2

あなたはおよそdoLog()が安全であることを気にしない場合は、次を呼び出す前に「完了します」 1、あなただけのアダムsetTimeout

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

を使用することができますthrottleこのCASで良くない理由として良い説明を与えますe。

+0

ああ、とても簡単です!私はsetTimeoutを試みたが、動的に遅延を増やすことは考慮しなかった。 –

2

抑制機能が待機期間中に複数回呼び出された場合、以降の呼び出しは無視されます。配列内のすべてのアイテムを処理する必要がある場合は、throttle()はおそらくあなたが望むものではありません。たとえば、UIの過度の更新を防ぐのに適しています。

出力に常にajが表示されるのは、先頭と後端のためです。配列全体は100ms未満で処理されましたが、先頭と末尾のデフォルトがtrueであるため、これらの呼び出し(抑制された関数の最初と最後の呼び出し)が両方とも表示されています。あなたがRxJSを使用することをいとわないだろう場合は、この答えはあなたがかなり慣用的にこれを実現させます

+0

先導/後縁についての説明をありがとう。出力の意味を理解するのに役立ちます。配列内の各アイテムを一定の割合で処理するための慣用的な解決策(またはライブラリ)がありますか? –

+0

私は確信しています。好奇心の外に、なぜ配列処理をレート制限したいのですか? –

+0

私はAPIを何度も呼びますが、あまりにも早く進むとそのAPIは私を拒否します。私は毎日のレートの下にうまくいますが、私は簡単に毎秒のレートでスパイクすることができます。 –

関連する問題