Skip to content

Commit 2deb617

Browse files
committed
docs: update call-apply-decorators/throttle article
1 parent b126223 commit 2deb617

File tree

4 files changed

+42
-37
lines changed

4 files changed

+42
-37
lines changed

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/_js.view/solution.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,33 @@ function throttle(func, ms) {
77
function wrapper() {
88

99
if (isThrottled) {
10-
// memorizar os últimos argumentos para a chamada depois da espera
10+
// memorizar os últimos argumentos a
11+
// chamar depois arrefecimento
1112
savedArgs = arguments;
1213
savedThis = this;
1314
return;
1415
}
1516

16-
// caso contrário vá para o estado de espera
17+
// caso contrário, passa ao estado
18+
// de arrefecimento
1719
func.apply(this, arguments);
1820

1921
isThrottled = true;
2022

21-
// planeia reinicializar isThrottled depois do atraso
23+
// planear reiniciar `isThrottled`
24+
// depois do atraso
2225
setTimeout(function() {
2326
isThrottled = false;
2427
if (savedArgs) {
25-
// se houver chamadas, savedThis/saveArgs tem a última
26-
// a chamada recursiva executa a função e configura a espera novamente
28+
// se houve chamadas, `savedThis` ou
29+
// `savedArgs` tem a última
30+
// a chamada recursiva executa a função
31+
// e define novamente o arrefecimento
2732
wrapper.apply(savedThis, savedArgs);
2833
savedArgs = savedThis = null;
2934
}
3035
}, ms);
3136
}
3237

3338
return wrapper;
34-
}
39+
}

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/_js.view/test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ describe("throttle(f, 1000)", function() {
2929

3030
it(" a terceira chamada espera 1000ms depois da segunda chamada", function() {
3131
this.clock.tick(100);
32-
f1000(4); // (throttling - menos do que 1000ms desde a última execução)
32+
f1000(4); // (regulação - menos do que 1000ms desde a última execução)
3333
this.clock.tick(100);
34-
f1000(5); // (throttling - menos do que 1000ms desde a última execução)
34+
f1000(5); // (regulação - menos do que 1000ms desde a última execução)
3535
this.clock.tick(700);
36-
f1000(6); // (throttling - menos do que 1000ms desde a última execução)
36+
f1000(6); // (regulação - menos do que 1000ms desde a última execução)
3737

3838
this.clock.tick(100); // agora 100 + 100 + 700 + 100 = 1000ms se passaram
3939

@@ -48,7 +48,7 @@ describe("throttle(f, 1000)", function() {
4848

4949
describe('throttle', () => {
5050

51-
it('executa a chamada encaminhada uma vez', done => {
51+
it('executa uma chamada encaminhada uma vez', done => {
5252
let log = '';
5353
const f = str => log += str;
5454
const f10 = throttle(f, 10);

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/solution.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ function throttle(func, ms) {
2929
}
3030
```
3131

32-
Uma chamada de `throttle(func, ms)` retorna `wrapper`.
32+
Uma chamada a `throttle(func, ms)` retorna `wrapper`.
3333

34-
1. Durante a primeira chamada, o `wrapper` apenas executa `func` e configura o estado de espera (`isThrottled = true`).
35-
2. Neste estado todas as chamadas são memorizadas em `savedArgs/savedThis`. Note que ambos, o contexto e os argumentos, são igualmente importantes e devem ser memorizados. Nós precisamos deles simultaneamente para reproduzir a chamada.
36-
3. Depois que `ms` milissegundos passam, `setTimeout` é acionada. O estado de espera é removido (`isThrottled = false`) e, se nós tivermos chamadas ignoradas , o `wrapper` é executado com os últimos argumentos e contexto memorizados.
34+
1. Durante a primeira chamada, o `wrapper` apenas executa a `func` e define o estado de arrefecimento (`isThrottled = true`).
35+
2. Neste estado todas as chamadas são memorizadas em `savedArgs/savedThis`. É de notar que tanto o contexto como os argumentos são igualmente importantes e devem ser memorizados. Nós precisamos destes simultaneamente para reproduzir a chamada.
36+
3. Após `ms` milissegundos, `setTimeout` é acionada. O estado de arrefecimento é removido (`isThrottled = false`) e, se tivermos ignorado chamadas, o `wrapper` é executado com os últimos argumentos e contexto memorizados.
3737

38-
O terceiro passo executa não `func`, mas o `wrapper`, porque nós não só precisamos de executar `func`, mas mais uma vez, de entrar no estado de espera e configurar o tempo limite para reiniciá-lo.
38+
O terceiro passo não executa a `func`, mas sim o `wrapper`, porque não só precisamos de executar a `func`, como também entrar novamente no estado de arrefecimento e configurar o tempo de espera para reiniciá-lo.

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,52 @@ importance: 5
22

33
---
44

5-
# O Decorador Throttle
5+
# Decorador Regulador
66

7-
Crie um decorador de "estrangulamento" `throttle(f, ms)` -- que retorne um encapsulador.
7+
Crie um decorador de "regulação" `throttle(f, ms)` -- que retorna uma função envolvente.
88

9-
Quando for chamado várias vezes, ele passa a chamada para `f` no máximo uma vez por `ms` milissegundos.
9+
Quando é chamado várias vezes, este passa a chamada a `f` no máximo uma vez por `ms` milissegundos.
1010

11-
A diferença de debounce é que é um decorador completamente diferente:
12-
- `debounce` executa a função uma vez depois do período de "espera". Boa para processar o resultado final.
13-
- `throttle` não é executada mais do que uma vez em `ms` de tempo. Boa para atualizações regulares que não sejam efectuadas num intervalo de tempo pequeno.
11+
Em comparação com o decorador de redução, o comportamento é completamente diferente:
12+
- `debounce` executa a função uma vez após o período de "arrefecimento". Bom para processar o resultado final.
13+
- `throttle` executa a função não mais frequentemente do que o tempo dado `ms`. Bom para atualizações regulares que não devem ser muito frequentes.
1414

15-
Por outras palavras, `throttle` é como uma secretária que aceita chamadas telefónicas, mas incomonda o chefe (chama a `f` atual) não mais do que uma vez por`ms` milissegundos.
15+
Por outras palavras, `throttle` é como uma secretária que aceita chamadas telefónicas, mas que incomoda a chefe (chama a verdadeira `f`) não mais do que uma vez por `ms` milissegundos.
1616

17-
Vamos verificar a aplicação na vida real para melhor compreender esse requisito e ver de onde ele vem.
17+
Vejamos a aplicação na realidade para compreender melhor este requisito e ver de onde vem.
1818

1919
**Por exemplo, queremos rastrear movimentos do rato**
2020

21-
Num navegador, nós podemos configurar uma função para ser executada a cada movimento do rato e receber a localização do ponteiro à medida que ele se move. Num período de uso constante do rato, esta função geralmente é executada com muita frequência, pode ser algo como 100 vezes por segundo (a cada 10 ms).
22-
**Gostaríamos de atualizar alguma informação na página web sempre que o ponteiro se mover.**
21+
Num navegador, podemos configurar uma função para ser executada em cada movimento do rato e obter a localização do ponteiro à medida que este se move. Durante uma utilização ativa do rato, esta função é normalmente executada com muita frequência, podendo ser algo como 100 vezes por segundo (a cada 10 milissegundos).**Gostaríamos de atualizar algumas informações na página da Web quando o ponteiro se move.**
2322

24-
A função de atualização `update()` é muito pesada de se fazer a cada micro-movimento. Também não faz sentido executar isso mais de uma vez por 100ms.
23+
...Mas a função de atualização `update()` é demasiado pesada para o fazer em cada micro-movimento. Também não faz sentido atualizar mais do que uma vez por 100ms.
2524

26-
Portanto, vamos atribuir `throttle(update, 100)` como a função a ser executada a cada movimento de rato ao invés da `update()` original. O decorador será chamado com frequência, porém `update()` será chamada no máximo uma vez por 100ms.
25+
Por isso, a envolveremos no decorador: usamos `throttle(update, 100)` como uma função a ser executada em cada movimento do rato, em vez da `update` original. O decorador será chamado frequentemente, mas encaminhará a chamada a `update` no máximo uma vez a cada 100ms.
2726

28-
Visualmente, se parecerá com algo assim:
27+
Visualmente, terá o seguinte aspeto:
2928

3029
1. Para o primeiro movimento do rato a variante decorada passa a chamada para `update`. É importante que o usuário veja a nossa reação aos seus movimentos imediatamente.
31-
2. Depois, ao mover do rato, até `100ms` nada acontece. A variante decorada ignora as chamadas.
32-
3. Ao final de `100ms` -- mais um `update` acontece com as últimas coordenadas.
33-
4. Continuando, finalmente, o rato pára em algum lugar. A variante decorada espera até `100ms` expirarem e depois executa o `update` com as últimas coordenadas. Então, talvez o mais importante, as coordenadas finais do rato são processadas.
30+
1. Para o primeiro movimento do rato, a variante decorada passa imediatamente a chamada a `update`. Isso é importante, o usuário vê a nossa reação ao seu movimento imediatamente.
31+
2. Depois, à medida que o rato se move, até `100ms` nada acontece. A variante decorada ignora as chamadas.
32+
3. No final de `100ms` -- mais uma `update` acontece com as últimas coordenadas.
33+
4. Então, finalmente, o rato para em algum lugar. A variante decorada espera até `100ms` expiraram e depois executa a `update` com as últimas coordenadas. Assim, o mais importante, as últimas coordenadas do rato são processadas.
3434

35-
Um código de exemplo:
35+
Um exemplo de código:
3636

3737
```js
3838
function f(a) {
3939
console.log(a);
4040
}
4141

42-
// f1000 passa chamadas para f no máximo uma vez por 1000 ms
42+
// f1000 passa chamadas a `f` no máximo uma vez por 1000 ms
4343
let f1000 = throttle(f, 1000);
4444

4545
f1000(1); // exibe 1
46-
f1000(2); // (estrangulamento, 1000ms ainda não passaram)
47-
f1000(3); // (estrangulamento, 1000ms ainda não passaram)
46+
f1000(2); // (regulação, 1000ms ainda não passaram)
47+
f1000(3); // (regulação, 1000ms ainda não passaram)
4848

49-
// quando o tempo de 1000ms estiver esgotado...
49+
// quando o tempo de 1000ms se esgota...
5050
// ...exibe 3, o valor intermédio 2 foi ignorado
5151
```
5252

53-
P.S. Os argumentos e o contexto `this` passados para `f1000` devem ser passados para a função original `f`.
53+
P.S. Os argumentos e o contexto de `this` passados a `f1000` devem ser passados a `f` original.

0 commit comments

Comments
 (0)