π Search Terms
using
π Version & Regression Information
I assume it is in every version that using has been implemented
β― Playground Link
https://www.typescriptlang.org/play?ts=5.5.0-dev.20240404#code/BQQwzgngdgxgBMAlHAvAPjgbwFAwPZRgAucANngOapwDaAugNzbZxz6EkAOATngLYBLMAFMAIkM54R1KMIDucAAq9BI4MG7CweUgDdhAGjgB9ZOiwtWcEUQAqAvsLwBXIurMYcVq+QoA6TmcwAAtgACIIOAATCSlhOB5+IXiAIzwoiDDEJm9WTW09YSQcqwBfIwAGbMtS6ssvKxA5EAESIIEoKgAPagbvcGh4GgBlCD400j8B2HEwSWkUOFHxnT8AMzxucOWJqcgZ2JEsuiQLXJ9KAKDQsJ7pmFn51PTM6vPyy1ZSktYmlrawB0qJFFn0rCMxrsYnM4tQdqsNlswvDJtCnsdTmDvL4riFwpE0bC0hksj9cpoiM5uFAEipko84mSvgZPnBvjVmKwcYE8WFia8mJY-q1aUkRAyRILWOwCsI-L5gL5qrVikA
π» Code
(async () => {
const log = [];
const promiseDispose = new Promise((resolve, _) => {
setTimeout(() => {
log.push("y dispose promise body");
resolve();
}, 0);
});
{
await using x = {
async [Symbol.asyncDispose = Symbol.for("Symbol.asyncDispose")]() {
log.push("x asyncDispose body");
},
};
await using y = {
[Symbol.dispose = Symbol.for("Symbol.dispose")]() {
log.push("y dispose body");
return promiseDispose;
},
};
}
log.push("body");
await promiseDispose;
console.log(log);
})();
π Actual behavior
It logs ["y dispose body", "y dispose promise body", "x asyncDispose body", "body"]
π Expected behavior
It should log ["y dispose body", "x asyncDispose body", "body", "y dispose promise body"].
The "y dispose promise body" should be printed in the next event cycle, however it is printed before x asyncDispose body because the promise is awaited when disposing y.
Additional information about the issue
Per 7.5.6 GetDisposeMethod
NOTE: This function is not observable to user code. It is used to ensure that a Promise returned from a synchronous dispose method will not be awaited.
cc @rbuckton
π Search Terms
using
π Version & Regression Information
I assume it is in every version that
usinghas been implementedβ― Playground Link
https://www.typescriptlang.org/play?ts=5.5.0-dev.20240404#code/BQQwzgngdgxgBMAlHAvAPjgbwFAwPZRgAucANngOapwDaAugNzbZxz6EkAOATngLYBLMAFMAIkM54R1KMIDucAAq9BI4MG7CweUgDdhAGjgB9ZOiwtWcEUQAqAvsLwBXIurMYcVq+QoA6TmcwAAtgACIIOAATCSlhOB5+IXiAIzwoiDDEJm9WTW09YSQcqwBfIwAGbMtS6ssvKxA5EAESIIEoKgAPagbvcGh4GgBlCD400j8B2HEwSWkUOFHxnT8AMzxucOWJqcgZ2JEsuiQLXJ9KAKDQsJ7pmFn51PTM6vPyy1ZSktYmlrawB0qJFFn0rCMxrsYnM4tQdqsNlswvDJtCnsdTmDvL4riFwpE0bC0hksj9cpoiM5uFAEipko84mSvgZPnBvjVmKwcYE8WFia8mJY-q1aUkRAyRILWOwCsI-L5gL5qrVikA
π» Code
π Actual behavior
It logs
["y dispose body", "y dispose promise body", "x asyncDispose body", "body"]π Expected behavior
It should log
["y dispose body", "x asyncDispose body", "body", "y dispose promise body"].The "y dispose promise body" should be printed in the next event cycle, however it is printed before
x asyncDispose bodybecause the promise is awaited when disposingy.Additional information about the issue
Per 7.5.6 GetDisposeMethod
cc @rbuckton