Re: [whatwg/dom] Expose an `aborted` promise on AbortSignal? (#946)

@jakearchibald sure, that's a good question/point.

Here are two quick examples:

----

With timers (since they're the simplest API):

```js
// before
async function setTimeout(ms, { signal } = {}) {
  return await new Promise((resolve) => {
    const timer = setTimeout(() => {
      signal?.removeEventListener("abort", listener);
      resolve();
    }, ms);
    const listener = () => clearTimeout(timer); // maybe reject too
    if (signal?.aborted) {
      listener();
    } else {
      signal?.addEventListener("abort", listener);
    }
  });
}
```

After:

```js
// after
async function setTimeout(ms, { signal } = {}) {
  return await new Promise((resolve) => {
    const timer = setTimeout(() => {
      resolve();
    }, ms);
    // works in Node.js since timers are objects
    aborted(signal, timer).then(() => clearTimeout(timer)); // maybe reject too
  });
}
```

-----

With a database layer:

```js
class DB {
  // wraps a database with AbortSignal API support
  async query(string, { signal } = {}) {
    await this.open();
    const query = this.createQuery(string);
    if (signal?.aborted) {
      query.cancel(new AbortError());
    } else {
      signal?.addEventListener('abort', () => {
        query.cancel(new AbortError()); 
      });
    }
    return await query.promise();
  }
  // rest of the implementation
}
```

After: 

```js
class DB {
  // wraps a database with AbortSignal API support
  async query(string, { signal } = {}) {
    await this.open();
    const query = this.createQuery(string);
    aborted(signal, query).then(() => query.cancel(new AbortError()))
    return await query.promise();
  }
  // rest of the implementation
}
```

Let me know if the examples are what you had in mind or you had something else in mind :]

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/946#issuecomment-773546318

Received on Thursday, 4 February 2021 19:21:36 UTC