読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

typescriptのasync/awaitで生成されるコードを見てみる

TypeScript Node.js

この間、async/awaitを試しに使ってみたときの、↓のコード。
http://sourcechord.hatenablog.com/entry/2016/07/28/084127

トランスパイルすると、どんなコードが吐き出されるのか見てみました。

これが

function wait(n: number) {
    return new Promise(done => setTimeout(() => done(n), n));
}

async function main() {
    console.log("start");
    for (var i=0; i<10; i++) {
        await wait(1000);
        console.log("next");
    }
}

main();

こうなる

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments)).next());
    });
};
function wait(n) {
    return new Promise(done => setTimeout(() => done(n), n));
}
function main() {
    return __awaiter(this, void 0, void 0, function* () {
        console.log("start");
        for (var i = 0; i < 10; i++) {
            yield wait(1000);
            console.log("next");
        }
    });
}
main();
//# sourceMappingURL=index.js.map

意外とシンプルなコードが生成されてますね。

__awaiterってヘルパーが作られ、TypeScriptのコードでawaitな関数呼び出しをした部分で使用されてます。 ターゲットがES6なら、genaratorがあるからこのように変換できるみたい。

今後、ES3/ES5向けにも対応するみたいだけど、genaratorのない環境で、どんなコード生成するんだろ。。
まぁそれはそれとして、TypeScript2.1での、async/awaitのES3/ES5対応が待ち遠しいです。