- From: jhusain <notifications@github.com>
- Date: Thu, 02 Apr 2015 20:02:47 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/27/89137845@github.com>
I've implemented a Task library to demonstrate a more elegant way of handling cancellation than rejecting Promise chains. Tasks have nearly the same API as a Promise, but Tasks must be run explicitly. When you run a Task you get a subscription option you can use to stop observing the Task. When a Task detects that it has no more observers, it can optionally cancel any pending actions scheduled in order to resolve it. A Promise represents the eventual value of an asynchronous unit of work, but not the unit of work itself. A Task is an abstraction over both the unit of work and its eventual value. That's why a Task is cancellable, and a Promise is not. Here's an example of a program which waits for a user to click a button and then issues a network request to retrieve a stock quote. If the button is clicked again while the network request is still pending, the current network request is aborted and a new one is issued. var outgoingRequest;function waitForQuote() { // if there's a request in-flight, stop observing the result if (outgoingRequest) { outgoingRequest.dispose(); outgoingRequest = undefined; } outgoingRequest = Task. // wait for next button click... nextEvent(getQuoteButton, 'click'). // return a task with the stock quote and auto-unwrap result just like Promise's then when(function() { return getQuote('NFLX'); }). // run and await the result run(function(val) { // display the price priceTextBox.value = val; outgoingRequest = undefined; waitForQuote(); }); } waitForQuote(); Check out the repo here ( https://github.com/jhusain/task-lib/blob/master/README.md). In there I demonstrate many more usages of Task. Hopefully after reading it will become clearer why I think choosing a more appropriate abstraction for async tasks is preferable to bolting cancellation semantics on to a Promise. You can also play with a live (but stubbed) example here: http://requirebin.com/?gist=533ad1e9d573ea7e9c5e Later this week I'll fork the fetch polyfill to demonstrate how elegantly Task could replace Promises in this API. On Thu, Apr 2, 2015 at 12:22 PM, Petka Antonov <notifications@github.com> wrote: > @WebReflection <https://github.com/WebReflection> .cancellable is old > api, new api doesnt have it > > — > Reply to this email directly or view it on GitHub > <https://github.com/whatwg/fetch/issues/27#issuecomment-89015617>. > --- Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/27#issuecomment-89137845
Received on Friday, 3 April 2015 03:03:09 UTC