Yad Smood (2015-08-03T06:08:06.000Z)
I have thought about something similar before, and used it in one of my
libs. Recently, I have come up another idea, it was already implemented on
Yaku:

let Promise = require('yaku')
// The `self` is the instance of the newly created promise.let p = new
Promise((resolve, reject, self) => {
    let tmr = setTimeout(resolve, 3000)

    let self.abort = () => {
        clearTimeout(tmr)
        reject(new Error('abort promise'))
    }

})

p.abort()

The origin post is here:
https://github.com/promises-aplus/cancellation-spec/issues/16.

what do you think about it?

2015年8月3日(月) 8:43 Glen Huang <curvedmark at gmail.com>:

> I was discussing with Jake Archibald about cancelable promises the other
> day. I was trying to convince him promise.cancel() might not be a good
> idea. But that conversation unfortunately leans more towards on how the
> abort API should be exposed on fetch. I did provide some thoughts on that
> topic, and think the abort API represents a strong use case for cancelable
> promises. But I feel what's more important is the underlying control flow
> design.
>
> So I would like to offer my proposal of cancelable promises here, and
> would like to ask if you think it's a good idea, or if promise.cancel() is
> actually a good idea and my understanding of promises is flawed.
>
> I think that promises should be an observation API. In other words, it
> should be kept as one-way communication. This keeps promises simple and
> easy to reason about.
>
> When we talk about cancelable promises, what we really want is the ability
> to:
>
> 1. abort the action that the root promise observes.
> 2. let child promises show disinterest on the result of that action
>
> With the premise that promises should be one-way communication, it's clear
> that #1 should be achieved with a separate API. For example:
>
> ```
> let query = queryDB(sql);
> query.done.then(data => console.log(data));
> query.abort();
> ```
>
> This means you need to have access to that separate API in order to abort
> the action, instead of just the promise.
>
> And abort() rejects the root promise with a special error object, if it's
> pending.
>
> This also means the abort API doesn't have to be universal. Each action
> initiator can design their own APIs to abort that action.
>
> And correspondingly, to create a "cancelable promise" with the Promise
> constructor, it can be as simple as:
>
> ```
> function doAction() {
>         let abort;
>         let done = new Promise((res, rej) => {
>                 asyncAction(res, rej);
>                 abort = () => rej(new AbortError());
>         });
>         return {done, abort};
> }
> ```
>
> For #2, I propose we add a method to Promise.prototype that undos .then()
> (probably also a sugar to undo .catch()) like removeEventListener undos
> addEventListener. For example.
>
> ```
> let query = queryDB(sql);
> let updateView = data => render(data);
> let log = data => console.log(data);
> query.done.then(updateView).then(log);
> query.done.ignore(updateView); // deregister callback, updateView and log
> will never be called
> setTimeout(() => {
>         query.done.then(updateView); // unless callback is registered again
> }, timeEnoughForQueryToFinish);
> ```
>
> You can think it as that each promise keeps a list of its child promises,
> when the same callback is passed to .ignore() it sets a flag on the
> corresponding child promise so that when itself resolves/rejects, it won't
> pass that state to that child promise, unless that the same callback is
> later registered again.
>
> What do you think of this design? Do you think it covers all of your use
> cases for cancelable promises?
>
> I have to give credit for Kyle Simpson and Jake Archibald for this idea.
> Kyle's opposition of sending signal back to the promise vendor, and Jake's
> argument that we need a way to let an observer signal disinterest greatly
> clarifies my understanding of promises.
>
> I guess someone has probably expressed this idea somewhere in some way (or
> in some libraries). Sorry if I missed that.
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150803/1c4c4780/attachment-0001.html>
y.s.inside at gmail.com (2015-08-03T08:05:04.692Z)
I have thought about something similar before, and used it in one of my
libs. Recently, I have come up another idea, it was already implemented on
Yaku:

```js
let Promise = require('yaku')
// The `self` is the instance of the newly created promise.let p = new
Promise((resolve, reject, self) => {
    let tmr = setTimeout(resolve, 3000)

    let self.abort = () => {
        clearTimeout(tmr)
        reject(new Error('abort promise'))
    }

})

p.abort()
```

The origin post is here:
https://github.com/promises-aplus/cancellation-spec/issues/16.

what do you think about it?

2015年8月3日(月) 8:43 Glen Huang <curvedmark at gmail.com>: