- From: Sean Hogan <shogun70@westnet.com.au>
- Date: Wed, 15 May 2013 23:33:59 +1000
- To: www-dom@w3.org
- CC: Anne van Kesteren <annevk@annevk.nl>
I'm perplexed by the second step of future wrapper callbacks: Set callback's callback this value <http://dev.w3.org/2006/webapi/WebIDL/#dfn-callback-this-value> to resolver's associated future <http://dom.spec.whatwg.org/#concept-future>. Assuming this results in the equivalent of: callback.call(future, value) then I can't work out the purpose. Is there a use for calling `future.then()`, etc inside the callback? There is also a potential failure mode in the unlikely case that the callback returns `this`, that is, returns the current future object. The result would be the following: future.then(function() { return this; }); // returns future run the associated resolver's resolve() with future future has a `then` method so it is called with callbacks that would run future's resolve and reject algorithms now future is still pending until those callbacks get called, but they won't get called until future is resolved. Obviously this stalls permanently. Again this scenario is unlikely, but it is another indicator to me that the spec is wrong (has a typo?) My first thought was that the step was supposed to read: Set callback's callback this value <http://dev.w3.org/2006/webapi/WebIDL/#dfn-callback-this-value> to resolver. But that doesn't make sense either because the callback is supposed to cause the future to be resolved by returning a value or throwing an error (or by returning a **separate** Future). However, I do think this behavior would be useful. Imagine a method of Future - say Future.prototype.whenever - which behaves like `then`, except that callbacks are called as: callback.call(resolver, value); This would make asynchronous pipes straight-forward. I'd better give an example: Future.accept(startValue) .whenever(function(value) { var r = this; setTimeout(function() { r.accept(2*value); }); }) .whenever(function(value) { var r = this; setTimeout(function() { r.accept(value + 8); }); }) .done(function(value) { console.log(value); }); The callbacks can behave similarly to the `init` function called from `new Future(init)`. If the `init` function was also called in this way then the concept would be easier to grasp.
Received on Wednesday, 15 May 2013 13:34:27 UTC