Skip to content

Commit 4c047c2

Browse files
committed
fixup! Perform Promise<T> type conversion lazily
1 parent b52f444 commit 4c047c2

File tree

2 files changed

+89
-24
lines changed

2 files changed

+89
-24
lines changed

lib/types.js

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -328,39 +328,52 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
328328
}
329329

330330
function generatePromise() {
331-
str += `${name} = new Promise(resolve => resolve(${name}));`;
331+
str += `
332+
${name} = new Promise(resolve => resolve(${name}));
333+
Object.assign(${name}, {
334+
then(onFulfilled, onRejected) {
335+
return Promise.prototype.then.call(
336+
this,
337+
`;
332338

333-
if (idlType.idlType[0].idlType !== "void") {
339+
if (idlType.idlType[0].idlType === "void") {
340+
str += `
341+
() => {
342+
if (typeof onFulfilled === "function") {
343+
return onFulfilled();
344+
}
345+
},
346+
`;
347+
} else {
334348
const convOnFulfilled = generateTypeConversion(ctx, "value", idlType.idlType[0], [], parentName,
335349
`${errPrefix} + " promise value"`);
336350
requires.merge(convOnFulfilled.requires);
337351

338-
const convOnRejected = generateTypeConversion(ctx, "reason", { idlType: "any" }, [], parentName,
339-
`${errPrefix} + " promise value"`);
340-
requires.merge(convOnRejected.requires);
341-
342352
str += `
343-
Object.assign(${name}, {
344-
then(onFulfilled, onRejected) {
345-
return Promise.prototype.then.call(
346-
this,
347-
value => {
348-
${convOnFulfilled.body.trim()}
349-
if (typeof onFulfilled === "function") {
350-
return onFulfilled(value);
351-
}
352-
},
353-
reason => {
354-
${convOnRejected.body.trim()}
355-
if (typeof onRejected === "function") {
356-
return onRejected(reason);
357-
}
353+
value => {
354+
${convOnFulfilled.body.trim()}
355+
if (typeof onFulfilled === "function") {
356+
return onFulfilled(value);
358357
}
359-
);
360-
}
361-
});
358+
},
362359
`;
363360
}
361+
362+
const convOnRejected = generateTypeConversion(ctx, "reason", { idlType: "any" }, [], parentName,
363+
`${errPrefix} + " promise value"`);
364+
requires.merge(convOnRejected.requires);
365+
366+
str += `
367+
reason => {
368+
${convOnRejected.body.trim()}
369+
if (typeof onRejected === "function") {
370+
return onRejected(reason);
371+
}
372+
}
373+
);
374+
}
375+
});
376+
`;
364377
}
365378

366379
function generateFrozenArray() {

test/__snapshots__/test.js.snap

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ exports.convert = function convert(value, { context = \\"The provided value\\" }
3232
then(onFulfilled, onRejected) {
3333
return Promise.prototype.then.call(
3434
this,
35+
3536
value => {
3637
value = conversions[\\"any\\"](value, { context: context + \\" promise value\\" });
3738
if (typeof onFulfilled === \\"function\\") {
3839
return onFulfilled(value);
3940
}
4041
},
42+
4143
reason => {
4244
reason = conversions[\\"any\\"](reason, { context: context + \\" promise value\\" });
4345
if (typeof onRejected === \\"function\\") {
@@ -3708,6 +3710,28 @@ exports.install = (globalObject, globalNames) => {
37083710
{
37093711
let curArg = arguments[0];
37103712
curArg = new Promise(resolve => resolve(curArg));
3713+
Object.assign(curArg, {
3714+
then(onFulfilled, onRejected) {
3715+
return Promise.prototype.then.call(
3716+
this,
3717+
3718+
() => {
3719+
if (typeof onFulfilled === \\"function\\") {
3720+
return onFulfilled();
3721+
}
3722+
},
3723+
3724+
reason => {
3725+
reason = conversions[\\"any\\"](reason, {
3726+
context: \\"Failed to execute 'voidPromiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"
3727+
});
3728+
if (typeof onRejected === \\"function\\") {
3729+
return onRejected(reason);
3730+
}
3731+
}
3732+
);
3733+
}
3734+
});
37113735
args.push(curArg);
37123736
}
37133737
return esValue[implSymbol].voidPromiseConsumer(...args);
@@ -3734,6 +3758,7 @@ exports.install = (globalObject, globalNames) => {
37343758
then(onFulfilled, onRejected) {
37353759
return Promise.prototype.then.call(
37363760
this,
3761+
37373762
value => {
37383763
value = conversions[\\"double\\"](value, {
37393764
context: \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"
@@ -3742,6 +3767,7 @@ exports.install = (globalObject, globalNames) => {
37423767
return onFulfilled(value);
37433768
}
37443769
},
3770+
37453771
reason => {
37463772
reason = conversions[\\"any\\"](reason, {
37473773
context: \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"
@@ -8913,12 +8939,14 @@ exports.convert = function convert(value, { context = \\"The provided value\\" }
89138939
then(onFulfilled, onRejected) {
89148940
return Promise.prototype.then.call(
89158941
this,
8942+
89168943
value => {
89178944
value = conversions[\\"any\\"](value, { context: context + \\" promise value\\" });
89188945
if (typeof onFulfilled === \\"function\\") {
89198946
return onFulfilled(value);
89208947
}
89218948
},
8949+
89228950
reason => {
89238951
reason = conversions[\\"any\\"](reason, { context: context + \\" promise value\\" });
89248952
if (typeof onRejected === \\"function\\") {
@@ -12547,6 +12575,28 @@ exports.install = (globalObject, globalNames) => {
1254712575
{
1254812576
let curArg = arguments[0];
1254912577
curArg = new Promise(resolve => resolve(curArg));
12578+
Object.assign(curArg, {
12579+
then(onFulfilled, onRejected) {
12580+
return Promise.prototype.then.call(
12581+
this,
12582+
12583+
() => {
12584+
if (typeof onFulfilled === \\"function\\") {
12585+
return onFulfilled();
12586+
}
12587+
},
12588+
12589+
reason => {
12590+
reason = conversions[\\"any\\"](reason, {
12591+
context: \\"Failed to execute 'voidPromiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"
12592+
});
12593+
if (typeof onRejected === \\"function\\") {
12594+
return onRejected(reason);
12595+
}
12596+
}
12597+
);
12598+
}
12599+
});
1255012600
args.push(curArg);
1255112601
}
1255212602
return esValue[implSymbol].voidPromiseConsumer(...args);
@@ -12573,6 +12623,7 @@ exports.install = (globalObject, globalNames) => {
1257312623
then(onFulfilled, onRejected) {
1257412624
return Promise.prototype.then.call(
1257512625
this,
12626+
1257612627
value => {
1257712628
value = conversions[\\"double\\"](value, {
1257812629
context: \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"
@@ -12581,6 +12632,7 @@ exports.install = (globalObject, globalNames) => {
1258112632
return onFulfilled(value);
1258212633
}
1258312634
},
12635+
1258412636
reason => {
1258512637
reason = conversions[\\"any\\"](reason, {
1258612638
context: \\"Failed to execute 'promiseConsumer' on 'PromiseTypes': parameter 1\\" + \\" promise value\\"

0 commit comments

Comments
 (0)