Re: [fetch] Aborting a fetch (#27)

FWIW I've implemented a cancelable Promise playground which is already suitable for everything discussed in here: https://gist.github.com/WebReflection/a015c9c02ff2482d327e

Here an example of how it works:
```js
// will be resolved
new Promise(function ($res, $rej, ifCanceled) {
  var internal = setTimeout($rej, 1000);
  ifCanceled(function () {
    clearTimeout(internal);
  });
})
// will be resolved without executing
.then(
  function () {
    console.log('on time');
  },
  function () {
    console.log('error');
  }
)
.cancel()
// will simply execute and resolve
.then(function () {
  console.log('no time');
});
```

The Promise is cancelable **only** if a function to describe how to cancel it is provided. This detail is hidden from the outer world.

In this scenario/case it would virtually look like the following:

```js

function fetch(url) {
  return new Promise(function (res, rej, ifCanceled) {
    var xhr = new XMLHttpRequest;
    xhr.open('GET', url, true);
    xhr.send(); // and the rest of the logic
    ifCanceled(function () {
      xhr.abort();
    });
  });
}

// outside
var page = fetch('index.html').then(function (text) {
  document.body.textContent = text;
});

// at any time later on, if needed
page.cancel().then(function () {
  console.log('nothing happened');
});
```

All involved promises will be silently resolved. The developer has the ability to react and it does not need to expose any cancel-ability if not meant.

The design is backward compatible with current Promise specification, without even requiring a `canceled` state.

I'm not sure it's perfect, but it works already and it seems to be suitable for any sort of scenario.

My 2 cents

---
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/fetch/issues/27#issuecomment-87617663

Received on Monday, 30 March 2015 09:50:19 UTC