+1

Allen

> On Oct 30, 2015, at 10:19 AM, Claude Pache <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> 
>> Le 29 oct. 2015 à 03:51, Boris Zbarsky <[email protected] 
>> <mailto:[email protected]>> a écrit :
>> 
>> I was just implementing subclassing of Promise in Gecko, when I realized 
>> that given a Promise subclass MyPromise these two calls:
>> 
>>  MyPromise.race([])
>>  MyPromise.all([])
>> 
>> will take MyPromise[@@species] into account when creating the return value, 
>> but these two calls:
>> 
>>  MyPromise.resolve()
>>  MyPromise.reject()
>> 
>> will not; they will invoke MyPromise itself, not MyPromise[@@species].
>> 
>> This is because 
>> http://www.ecma-international.org/ecma-262/6.0/#sec-promise.all 
>> <http://www.ecma-international.org/ecma-262/6.0/#sec-promise.all> and 
>> http://www.ecma-international.org/ecma-262/6.0/#sec-promise.race 
>> <http://www.ecma-international.org/ecma-262/6.0/#sec-promise.race> do the 
>> whole @@species thing but 
>> http://www.ecma-international.org/ecma-262/6.0/#sec-promise.reject 
>> <http://www.ecma-international.org/ecma-262/6.0/#sec-promise.reject> and 
>> http://www.ecma-international.org/ecma-262/6.0/#sec-promise.resolve 
>> <http://www.ecma-international.org/ecma-262/6.0/#sec-promise.resolve> do not.
>> 
>> Is this behavior intentional?  If so, I'd really like to understand the 
>> reason for it.
>> 
>> -Boris
> 
> Relevant discussion: https://esdiscuss.org/topic/performpromiseall 
> <https://esdiscuss.org/topic/performpromiseall>
> 
> As I understand, the specified behaviour is an accident of history. 
> Previously, `Promise.resolve()` and `Promise.reject()` used the species 
> pattern in order to determine the constructor to be used, just as 
> `Promise.all()` and `Promise.race()`. Then, at the last minute, it was 
> decided that it wasn’t the best semantics for `Promise.resolve()`, and it was 
> corrected. For `Promise.all()` and `Promise.race()`, the motivation wasn’t 
> stronger than the lack of time.
> 
> Should it be corrected before @@species is widely implemented? I think so. 
> The arguments I give are:
> 
> * Overall consistency in the language. Except for the two offending Promise 
> static methods, all uses of `@@species` in the ES2015 spec (15 uses) are for 
> the following pattern: Starting from one instance, one constructs a derived 
> object for that instance. (The effective lookup of the @@species property is 
> factored in the SpiecesConstructor and ArraySpeciesCreate abstract 
> operations.)
> 
> * Also, in static methods like `Promise.all` and `Promise.race`, a 
> constructor is explicitly provided by the user: simply use it. Compare with 
> what is done for arrays:
> 
>       Array.from(someArray) // use the Array constructor explicitly provided.
>       Array.of(x, y, z) // ditto
> 
>       someArray.slice(0) // compute the constructor to be used through some 
> algorithm involving @@species.
>       [].concat(x, y, z) // ditto
> 
> —Claude
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to