0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【async/await】JavaScriptで非同期処理プログラムを作成する【標準入力】

Last updated at Posted at 2020-04-05

はじめに

「解きながら学ぶJava」(その名の通り「〜〜するプログラムを作成せよ。」といった問題を解きながらJavaを学んでいく書籍)に書かれている問題を**"JavaScriptで書く"**ということをやっている中で見事に詰まりました。

JavaScriptは、JavaやRubyのようにクラスを用いて綺麗に定義、みたいなことがしづらいですし、標準入力も若干面倒なので結構苦戦しました
(今回はreadlineモジュールを使用)

ちなみに私は、上記の本を持っておきながら、Javaを触ったことはありません。笑

どんな問題?

キーボードから次々と整数値を読み込んで、合計と平均を求めるプログラムを作成せよ。加算する整数の個数は最初に読み込むこと。

という問題です。

実際に書いたプログラム

4_26.js
const readline = require('readline');
const log = console.log;
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let num_int;
let input_int;
let sum = 0;

async function readInt() {
    const rl = readline.createInterface({input: process.stdin});
    const ait = rl[Symbol.asyncIterator]();
    log('整数:');
    input_int = parseInt((await ait.next()).value);
};

function checkInt() {
    rl.question('何個加算しますか: ', async function (answer) {
        num_int = parseInt(answer);
        for(let i = 0; i < num_int; i++) {
            await readInt();
            sum += input_int;
        }
        rl.close();
        log(`合計は${sum}です。`);
        log(`平均は${sum / num_int}です。`);
    });
};

log('整数を加算します。');
checkInt();

コードの中身は深くは追いませんが、ざっくりポイントだけ記載します。

  • 大元の処理を行うcheckInt関数に、「何個加算しますか?」の問に対して入力された数の回数分だけfor文で処理をループさせている

  • checkInt関数とは別に、readInt関数を定義し、加算対象の数を入力する処理を書いている

  • 標準入力は、readlineモジュールを使用し、繰り返し入力が必要になる部分にasync/awaitを使用

async/awaitを使用することで非同期処理が可能となり、コンソールへの繰り返し入力が可能となります。

実行するとこんな感じになります(↓)

整数を加算します。
何個加算しますか: 3
整数:
48
整数:
67
整数:
89
合計は204です。
平均は68です。

上記のコードはあくまで一例ですので、ご参考までに。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?