I agree that promises should be standardized in Ecma-262. There are a number of 
subtleties that'll need to be hashed out:

- the tension between the flexible structural ("duck") type and the desire to 
have the semantics do different things based on dynamically testing "whether" 
something is a promise:
  * the common practice (sadly not at all spelled out in Promises/A) of 
treating a resolved value that is a promise as continuing to defer resolution
  * the `when` operation that either calls its callback synchronously or 
asynchronously depending on whether it's a promise

- whether it's a bad idea (*cough* it is *cough*) for `when` to do that

- whether promises ever call their callbacks synchronously

- every single corner case of when an error is thrown and where it is thrown

- the interaction with the event-loop semantics, which needs to be specified in 
ES6 but isn't yet written

- whether the `then` property name should be a symbol or a string

- a way to create promises that don't expose their internal "resolve me" 
methods, etc. so they can be delivered to untrusted clients, e.g.:

    var [internalView, externalView] = Promise.makePair();
    "resolve" in internalView // true
    "resolve" in externalView // false

I agree this is worth doing, though definitely post-ES6. Personally I would 
like to work on it but for me anyway it has to take a back seat to modules and 
binary data.

Dave

On Nov 6, 2012, at 10:47 AM, David Bruant <bruan...@gmail.com> wrote:

> Hi,
> 
> In a post to public-script-coord yesterday, Alex Russel wrote the following 
> [1]:
> "[Web]IDL *is handy. *More to the point, it's the language of the specs we 
> have now, and the default mode for writing new ones is "copy/paste some IDL 
> from another spec that looks close to what I need and then hack away until 
> it's close". This M.O. is exacerbated by the reality that most of the folks 
> writing these specs are C++ hackers, not JS developers. For many, WebIDL 
> becomes a safety blanket that keeps them from having to ever think about the 
> operational JS semantics or be confronted with the mismatches."
> 
> I wasn't aware of this and then read through about a dozen WebAPIs [2] 
> between yesterday and today and... discovered it's the case. In my opinion, 
> one of the most absurd example is the DOMRequest thing which looks like:
> {
>   readonly attribute DOMString readyState; // "processing" or "done"
>   readonly attribute DOMError? error;
>   attribute EventListener      onsuccess;
>   attribute EventListener      onerror;
>   attribute readonly any?      result;
> };
> 
> Read it carefully and you'll realize this is actually a promise... but it has 
> this absurd thing that it has to have both an error and result field while 
> only one is actually field at any given point.
> Also, these APIs and JavaScript as it they are won't support promise 
> chainability and the excellent error forwarding that comes with it 
> off-the-shelf. Also, the lack of a built-in Q.all really doesn't promote good 
> code when it comes to event synchronization.
> Oh yes, of course, you can always build a promise library on top of the 
> current APIs, blablabla... and waste battery with these libraries [3].
> 
> I'm coming with the following plan:
> 1) get promises in ECMAScript
> 2) get WebIDL to support ECMAScript promises
> 3) get browser APIs to use WebIDL promises
> 
> About the first step, there is a strawman [4] that contains promises and it 
> requires to define the event loop, so that's probably too much for ES6. Yet, 
> it doesn't prevent to agree on a promise API that will be adopted in ES7.
> Besides the strawman, promises have run a long way from CommonJS [5] to 
> jQuery [6] to Q [7] to Irakli's excellent post [8] to Domenic's recent rant 
> [9] and I've missed a lot of other examples probably. The JS community is 
> ready for promises. The idea has been used a lot.
> Different libraries have different APIs and I have no preference. The only 
> things I really care about is chaining (with error forwarding) and a 
> promise-joining function à la Q.all. I'll let people who care about naming 
> fight.
> 
> I'm sure TC39 can come to an agreement *before* ES7 standardization, 
> agreement that can be used by WebIDL and browser APIs (why not implemented 
> long before ES7 work has even started).
> If you're a JS dev and care about promises, please show some support to this 
> proposal :-)
> 
> David
> 
> [1] 
> http://lists.w3.org/Archives/Public/public-script-coord/2012OctDec/0122.html
> [2] https://wiki.mozilla.org/WebAPI#APIs
> [3] 
> http://assets.en.oreilly.com/1/event/79/Who%20Killed%20My%20Battery_%20Analyzing%20Mobile%20Browser%20Energy%20Consumption%20Presentation.pdf
> [4] http://wiki.ecmascript.org/doku.php?id=strawman:concurrency
> [5] http://wiki.commonjs.org/wiki/Promises
> [6] http://api.jquery.com/category/deferred-object/
> [7] https://github.com/kriskowal/q
> [8] http://jeditoolkit.com/2012/04/26/code-logic-not-mechanics.html
> [9] https://gist.github.com/3889970
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to