I don't see any problems with polyfills having to update, that's kinda how progress happens...

On 17 Apr 2018 08:13, "T.J. Crowder" <[email protected]> wrote:
On Mon, Apr 16, 2018 at 6:36 PM, Tab Atkins Jr.
<[email protected]> wrote:
>
> I'm still strongly of the opinion that we messed this up...
> Doing the reverse and letting
> objects opt *out* of being treated as promise-like is probably the
> most we can do at this point, unfortunately.

I was going to play devil's advocate here ("Is it **really** too late? Probably, but we should at least explore it..."), toying with the idea of a more strict kind of promise (I called it NativePromise), but I ran into a wall which may affect Symbol.thenable = false as well:

```js
someThirdPartyPromise.then(() => import("foo")).then(/*...*/);
```

That converts the promise from `import()` (which understands Symbol.thenable = false) into a non-native Promise, and thus triggers the bug Symbol.thenable is meant to resolve, since when `import()`'s promise resolves, it hands a thenable to the 3rd-party promise that doesn't handle Symbol.thenable = false. Boom.

How does this proposal address that? Because if it doesn't, and third-party libs are supposed to update to support Symbol.thenable = false, we should at least discuss making promises opt-in via Symbol.thenable = true for a special class or type of promise.

My thought (which, again, ran into the wall above) was: Add a new type of promise (call it NativePromise) which doesn't support thenables, just objects with Symbol.promise = true (note I didn't call it "thenable"). (I also toyed with well-known symbols for `then`, `catch`, and `finally` instead, but that's probably overkill). All language-generated and host-provided promises would be NativePromises (this would be a breaking change for `async` functions, thus impact assessment would be required). Notes:

* `import()` would use NativePromise and thus not be confused by a module exporting a `then` function
* NativePromise would be thenable
* Promise would continue to support thenables
* NativePromise would not, and thus would not be Promises/A+-compliant
* NativePromise and Promise would be fully interoperable (both would have Symbol.promise = true and `then`)
* Actively-maintained 3rd-party promise libs like Bluebird would implement Symbol.promise = true to get full interoperability with NativePromise
* NativePromise would only have one-way interoperability with any 3rd-party lib that didn't implement Symbol.promise = true

Again, that's where I ran into the wall above, which I think impacts Symbol.thenable = false as well.

-- T.J. Crowder

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

Reply via email to