Skip to content

Commit 120d91a

Browse files
authored
Async catch bug (#1195)
* Correctly handle resolving promises with other promises * Additional test * Fix async functions not ending after returning from catch
1 parent 4bd1872 commit 120d91a

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/lualib/Await.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ function __TS__AsyncAwaiter(this: void, generator: (this: void) => void) {
3636
function rejected(handler: ErrorHandler | undefined) {
3737
if (handler) {
3838
return (value: unknown) => {
39-
const [success, valueOrError] = pcall(handler, value);
39+
const [success, hasReturnedOrError, returnedValue] = pcall(handler, value);
4040
if (success) {
41-
step(valueOrError, handler);
41+
if (hasReturnedOrError) {
42+
resolve(returnedValue);
43+
} else {
44+
step(hasReturnedOrError, handler);
45+
}
4246
} else {
43-
reject(valueOrError);
47+
reject(hasReturnedOrError);
4448
}
4549
};
4650
} else {

test/unit/builtins/async-await.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,27 @@ test("async function adopts rejected promise", () => {
441441
.expectToEqual(["rejected"]);
442442
});
443443

444+
test("return in catch aborts async method", () => {
445+
util.testFunction`
446+
async function asyncFunc() {
447+
try {
448+
await Promise.reject("rejection");
449+
log("Should not be seen");
450+
} catch {
451+
log("C");
452+
return "result";
453+
}
454+
log("Should also not be seen");
455+
}
456+
457+
asyncFunc().then(v => log("resolved", v));
458+
459+
return allLogs;
460+
`
461+
.setTsHeader(promiseTestLib)
462+
.expectToEqual(["C", "resolved", "result"]);
463+
});
464+
444465
test.each(["async function abc() {", "const abc = async () => {"])(
445466
"can throw error after await in async function (%p)",
446467
functionHeader => {

0 commit comments

Comments
 (0)