> Le 29 oct. 2015 à 03:51, Boris Zbarsky <[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 and 
> 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 and 
> 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]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to