Re: Future cancellation

IMO, cancelation is not appropriate for promises/futures. (sticking with the name "promises", sorry for the distraction).

Promises represent a value, but have no knowledge of the work involved to get the value. The work knows about the promise, the promise doesn't know about the work. If you want to externalize additional controls to allow your code to steer the work involved in getting the promised value, that is justification for a separate class that contains a promise, likely exposing a 'then()' method linked to its internal promise. The code used to set up the resolve/reject conditions can externalize the reject method to enable cancelation for instances of that class. But the promise remains limited to a value proxy. The more a class needs to know about the work, the more specialized the class becomes, which Promise has avoided pretty well so far.

Luke

On 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.
>  
> Ron
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

Received on Tuesday, 30 April 2013 14:51:18 UTC