You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1012 B
Markdown
41 lines
1012 B
Markdown
# Abortable promises ⚡
|
|
|
|
A module for node that lets you run complex sequence of async steps and:
|
|
|
|
1. Use an external signal to stop the sequence of steps
|
|
|
|
```typescript
|
|
const sleep = promisify((timeout: number, callback: (...args: any[]) => void) =>
|
|
setTimeout(callback, timeout)
|
|
);
|
|
|
|
const a = new AbortablePromise(async function* () {
|
|
yield await sleep(1000);
|
|
console.log("awaited 100");
|
|
yield await sleep(2000);
|
|
console.log("awaited 200");
|
|
yield await sleep(3000);
|
|
console.log("awaited 300");
|
|
});
|
|
|
|
setTimeout(() => a.abort(), 1500); // doesn't get to sleep(3000)
|
|
```
|
|
|
|
2. Use an external signal to kill an _already started_ asynchronous step
|
|
|
|
```typescript
|
|
const b = new AbortablePromise(async function* (await_or_abort) {
|
|
const ping = await deferedSpawn("ping", ["8.8.8.8"]);
|
|
while (true) {
|
|
console.log(
|
|
await await_or_abort(ping.waitForNextData(), () => {
|
|
ping.kill();
|
|
})
|
|
);
|
|
yield;
|
|
}
|
|
});
|
|
|
|
setTimeout(() => b.abort(), 5000); // doesn't get to 5th ping
|
|
```
|