typescript の async/await で直列 vs 並列

typescript でちょっとやってみました。

http://httpbin.org/delay/{delay} というのは delay 秒待ってからレスポンス返してくれる URL です。

/*
 * serial vs parallel
 */
import request from 'request-promise-native';

function createUrl(sec: number): string {
    const secStr: string = String(sec);
    return `http://httpbin.org/delay/${secStr}`;
}

async function serial(urls: string[]): Promise<string[]> {
    let results = [];
    for (const url of urls) {
        const ret = await request(url);
        results.push(ret);
    }
    return results;
}

async function parallel(urls: string[]): Promise<string[]> {
    const promises = [];
    for (const url of urls) {
        const promise = request(url);
        promises.push(promise);
    }
    const results = await Promise.all(promises);
    return results;
}

async function main() {
    const range = [1, 2, 3, 4];
    const urls = range.map(createUrl);

    let startTime = Date.now();
    let results = await serial(urls);
    console.log('serial');
    // 1 + 2 + 3 + 4 = 10 秒かかる
    console.log((Date.now() - startTime) / 1000);

    startTime = Date.now();
    results = await parallel(urls);
    console.log('parallel');

    // max(1, 2, 3, 4) = 4 秒かかる
    console.log((Date.now() - startTime) / 1000);
}
main();

動かしてみる。

$ mkdir test; cd $_
$ pbpaste > index.ts
$ npm init -y
$ npm i -S typescript @types/node
$ npm i -S request @types/request
$ npm i -S request-promise-native @types/request-promise-native
$ npx tsc --init
$ vim .tsconfig # target を es2017 に
$ npx tsc
$ node -v
v8.4.0
$ node ./index.js
serial
11.58
parallel
4.373

ちゃんと並列で動いてますね。