Skip to content

ts.transpile does't handle async/await correctly #4135

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
weswigham opened this issue Aug 4, 2015 · 1 comment
Closed

ts.transpile does't handle async/await correctly #4135

weswigham opened this issue Aug 4, 2015 · 1 comment
Labels
Question An issue which isn't directly actionable in code

Comments

@weswigham
Copy link
Member

It emits the __awaiter and transforms await statements into yield statements, but functions marked async aren't transformed to wrappers around an __awaiter'd generator.

For example,

var a = async () => await Promise.resolve(2);

yields

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};
var a = function () { return yield Promise.resolve(2); };

when it should probably be

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};
var a = function() { return __awaiter(void 0, void 0, Promise, function*() { return yield Promise.resolve(2); }); };
@vladima
Copy link
Contributor

vladima commented Aug 4, 2015

async functions are supported only in ES6 and by default transpile uses ES5. Everything should work fine if you pass ScriptTarget,ES6 through compiler options.

// test.js
var ts = require('typescript');
console.log(ts.transpile("var a = async () => await Promise.resolve(2);", { target: ts.ScriptTarget.ES6 }))
C:\Sources\1>npm install typescript@next
[email protected] node_modules\typescript

C:\Sources\1>node test.js
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};
var a = () => __awaiter(this, void 0, Promise, function* () { return yield Promise.resolve(2); });

@vladima vladima closed this as completed Aug 4, 2015
@mhegazy mhegazy added the Question An issue which isn't directly actionable in code label Aug 4, 2015
@microsoft microsoft locked and limited conversation to collaborators Jun 19, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Question An issue which isn't directly actionable in code
Projects
None yet
Development

No branches or pull requests

3 participants