- From: Ron Buckton <rbuckton@chronicles.org>
- Date: Wed, 1 May 2013 00:42:26 +0000
- To: Jonas Sicking <jonas@sicking.cc>
- CC: es-discuss <es-discuss@mozilla.org>, "public-script-coord@w3.org" <public-script-coord@w3.org>, Tab Atkins Jr. <jackalmage@gmail.com>
Jonas, As I mentioned to Alex Russel, I'm also interested in the benefits of using a subclass. I have two additional gists around cancellation, one that uses an external token for cancelation [1] (similar to .NET/C#), and another that uses a subclass [2] (though I still need to spend some additional time on the subclass sample). [1] https://gist.github.com/rbuckton/5490373 [2] https://gist.github.com/rbuckton/5490482 I agree with the sentiment that Future#cancel is a bad idea. Ron > -----Original Message----- > From: Jonas Sicking [mailto:jonas@sicking.cc] > Sent: Tuesday, April 30, 2013 4:47 PM > To: Ron Buckton > Cc: es-discuss; public-script-coord@w3.org; Tab Atkins Jr. > Subject: Re: Future cancellation > > On Mon, Apr 29, 2013 at 6:57 PM, Ron Buckton <rbuckton@chronicles.org> > wrote: > > I've created separate gists for three different ways that I am > > currently investigating as a means to support the cancellation of a > > Future. These can be found here: > > > > > > > > 1. Cancellation using Future: https://gist.github.com/rbuckton/5486149 > > > > 2. Cancellation using Future.cancelable: > > https://gist.github.com/rbuckton/5484591 > > > > 3. Cancellation using Future#cancel: > > https://gist.github.com/rbuckton/5484478 > > > > > > > > Each has a list of some of the benefits and issues I've seen while > > experimenting with each approach, as well as possible changes to the > > various APIs or algorithms for Future to make each happen. > > > > > > > > In general, cancellation of a Future can be beneficial in a number of cases. > > One example is the case where you are requesting a resource from a > > remote server using XHR. If the request was being made to fetch a page > > of data, and the user opted to move to the next page before the > > current page completed loading, it no longer becomes necessary to > > continue fetching the remote resource. In addition, it is no longer > > necessary to handle any additional computation or transformation logic > > that would have resulted from the successful completion of the fetch > > operation. Having the ability to cancel the request allows an > > application to quickly release resources that it no longer needs. > > > > > > > > It is also useful to be able to handle the cancelation of a long > > running task that might be executing in a Worker. In this case, > > cleanup logic that is part of cancelation would request the worker to > > close, ending the current operation and releasing resources. > > > > > > > > Both of the above examples are indicative of cancelling the root of an > > operation, but there are also circumstances where you might want to > > cancel a chained Future and any Future chained from it, without canceling > the root. > > In the previous example regarding paged data, I might wish to allow > > the fetch operation to complete so that I could cache the data for > > quick retrieval, but would only want to cancel any possible UI updates > > that might occur in a chained Future. > > > > > > > > I'm interested to hear what others think with respect to properly > > handling cancellation with Futures. > > I do not think that we should add cancellation on the base Future interface. I.e. > we shouldn't make *all* Futures cancellable. > > Cancelability should only be possible when the implementation of the Future > would actually stop doing work if the Future is cancelled. I.e. > cancelling a Future shouldn't simply prevent the result callbacks from being > called, but it should prevent whatever work is needed to calculate the result > from happening. > > However it would be very complex and expensive if we had to make all APIs > that want to use Futures also support being cancelled. > > The solution is to create a subclass of Future which allows the back-end work to > be cancelled. I.e. a CancelableFuture, or AbortableFuture. This subclass would > have a .cancel() or .abort() method on it. The FutureResolver created when the > CancelableFuture is created would have a callback which is called when > .cancel()/.abort() is called. > > This would be useful if we create an Future-based API for doing network > requests or file reading. > > In other words, the should be the choice of the implementor of a given API to > determine if it wants to return a Future which can be cancelled, or one that > can't. Obviously this needs to be documented for that API, just like you > document that the API returns a Future at all. > > / Jonas
Received on Wednesday, 1 May 2013 00:42:59 UTC