2.1.3 • Published 2 months ago

@lumino/polling v2.1.3

Weekly downloads
29,077
License
BSD-3-Clause
Repository
github
Last release
2 months ago

@lumino/polling

This package provides a class for generic polling functionality (Poll). It also provides rate limiters (Debouncer and Throttler).

The Poll class provides three different ways to "subscribe" to poll ticks:

  • @lumino/signaling: Poll#ticked is a Lumino signal that emits each time there is a poll tick.
  • Promise-based: Poll#tick is a promise that resolves after every tick and only rejects when the poll is disposed.
  • AsyncIterable: Poll#[Symbol.asyncIterator] implements the async iterable protocol that allows iteration using for-await...of loops.

Example usage

These are examples from the unit tests for this package. They demonstrate the three different ways polling is supported.

Using Poll#tick promise

Here, we set up the testing state variables and create a new Poll instance.

const expected = 'started resolved resolved';
const ticker: IPoll.Phase<any>[] = [];
const tock = (poll: Poll) => {
  ticker.push(poll.state.phase);
  poll.tick.then(tock).catch(() => undefined);
};
const poll = new Poll({
  auto: false,
  factory: () => Promise.resolve(),
  frequency: { interval: 100, backoff: false }
});

Next we assign the tock function to run after the poll ticks and we start the poll.

void poll.tick.then(tock);
void poll.start();

And we verify that the ticker did indeed get populated when tock was called and the next promise was captured as well.

await sleep(1000); // Sleep for longer than the interval.
expect(ticker.join(' ').startsWith(expected)).to.equal(true);
poll.dispose();

Using Poll#ticked signal

Here, we set up the testing state variables and create a new Poll instance.

const poll = new Poll<void, void>({
  factory: () => Promise.resolve(),
  frequency: { interval: 100, backoff: false }
});

Here we connect to the ticked signal and simply check that each tick matches the poll state accessor's contents.

poll.ticked.connect((_, tick) => {
  expect(tick).to.equal(poll.state);
});
await sleep(1000); // Sleep for longer than the interval.
poll.dispose();

Using Poll as an AsyncIterable

Here, we set up the testing state variables and create a new Poll instance.

let poll: Poll;
let total = 2;
let i = 0;

poll = new Poll({
  auto: false,
  factory: () => Promise.resolve(++i > total ? poll.dispose() : void 0),
  frequency: { interval: Poll.IMMEDIATE }
});

const expected = `started${' resolved'.repeat(total)}`;
const ticker: IPoll.Phase<any>[] = [];

Then the poll is started:

void poll.start();

Instead of connecting to the ticked signal or awaiting the tick promise, we can now use a for-await...of loop:

for await (const state of poll) {
  ticker.push(state.phase);
  if (poll.isDisposed) {
    break;
  }
}

And we check to make sure the results are as expected:

// ticker and expected both equal:
// 'started resolved resolved disposed'
expect(ticker.join(' ')).to.equal(expected);

Note for consumers of async iterators

In order to use for-await...of loops in TypeScript, you will need to use ES2018 or above in your lib array in tsconfig.json.

2.1.3

2 months ago

2.1.2

1 year ago

2.0.0-rc.1

2 years ago

2.1.1

1 year ago

2.1.0

1 year ago

2.0.0

1 year ago

2.0.0-rc.0

2 years ago

1.11.4

2 years ago

2.0.0-alpha.7

2 years ago

2.0.0-beta.1

2 years ago

2.0.0-beta.0

2 years ago

1.11.3

2 years ago

1.11.2

2 years ago

2.0.0-alpha.3

2 years ago

2.0.0-alpha.4

2 years ago

2.0.0-alpha.5

2 years ago

2.0.0-alpha.6

2 years ago

2.0.0-alpha.0

2 years ago

2.0.0-alpha.1

2 years ago

2.0.0-alpha.2

2 years ago

1.11.1

2 years ago

1.11.0

2 years ago

1.10.0

3 years ago

1.9.1

3 years ago

1.9.0

3 years ago

1.8.0

3 years ago

1.7.0

3 years ago

1.6.2

3 years ago

1.6.1

3 years ago

1.6.0

3 years ago

1.5.0

3 years ago

1.4.0

3 years ago

1.3.3

4 years ago

1.3.2

4 years ago

1.3.1

4 years ago

1.3.0

4 years ago

1.3.0-alpha.0

4 years ago

1.2.2

4 years ago

1.2.1

4 years ago

1.2.0

4 years ago

1.1.1

4 years ago

1.1.0

4 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago