NodeSchoolに入学しよう!

並列的でのデータの取得

全333コースを10日間無料で

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
非同期I/Oを使用してデータを並列に読み出す方法について学びます。
講師:
10:21

字幕

このレッスンでは 並列に取得された 複数のデータを 処理する方法について 学びます それでは ワークショッパーを開きましょう learnyounode enter 今回はこちらの 9番目の JUGGLING ASYNCという 問題を解きます エンターを押します 問題 コマンドライン引数で与えられた 3つのURLに対して HTTPの GETリクエストを行ったうえで そのレスポンスデータを 収集し URLごとに1行ずつ コンソールに出力する プログラムを書いてください ただし 結果を出力する順番は 与えられたパラメータの 順番と同じにすること さて 今回の問題は コマンドラインから 複数のURLが与えられるので それらのURLに対して ぞれGETをおこなった上で そのGETを おこなったデータを 一行に それぞれまとめあげて そのURLの分だけ console.logをおこなう ということです たとえばURLが今回 3つ与えられるということなので console.logは 3回実行することになるでしょう そして 注意すべき点として HTTPモジュールのGETは 非同期の呼び出しなので これをたとえば このように 3つ立て続けに 呼び出したとすると その実行は 並列でおこなわれます 並列でおこなわれる ということは 1番目に呼び出した GETのデータの取得が 必ずしも一番最初に完了する とは限らないということです たとえばこの3番目の データの取得が 1番最初に 完了して 2番目が その次に完了して 最後にデータの取得が 完了するのは 1番最初の呼び出しである という可能性もあるのです これが非同期ということの 意味です 逆に もしこのHTTPの GETメソッドが 同期I/O  同期関数であったならば 実行の順番は必ず 書いた順番と同じである ということが 保証されます なぜならば 同期関数は その処理の実行が終わるまで 関数の呼び出しが 戻ってこないためです そのため この時点では 1番目のGETが呼び出されて その呼び出しが 完了すると もうそのデータの取得が 完了している ということが 保証されるのです しかしながら実際には ノードのGETメソッドは 非同期I/Oですので 呼び出した順番に データを並べて 出力したい場合には ひと工夫が 必要になります ヒントとしては データが取得できた時点ですぐに console.logに 出力してしまうと その出力される順番は 今説明したように 不定となってしまうので 何か一時的に そのデータを 入れ物に入れておいて そして すべてのデータの 取得が完了した時点で それらをまとめて 並べなおして出力する ということをする 必要があるはずです この問題に関しては 解き方は人それぞれで 色々な問題の解き方が あると思います それではここで 一旦動画を止めて 皆さんで 問題を 解いてみてください さて皆さん 問題は 解けましたでしょうか 答え合わせを していきいます それでは テキストエディタで 答えを 書いていきます program.jsという テキストファイルを開きます まずはHTTPモジュールの ロードです require('http') それから今回 BLモジュールを使用しますので BLモジュールも ロードしておきます ロード bl そして今回 コマンドライン引数で 複数のURLが 与えられるということなので それを処理するために まずはそれを一度 変数の中に格納しておきましょう urls = argvの 2番目以降の要素を 取得して 部分的な配列を作るために sliceメソッドを使用します これで このurlsの中には urlだけが 入っている状態になります ちょっと一旦 sliceメソッドの挙動を 説明します nodeを立ち上げて たとえばa b cという 3つの要素がある 配列があるとして それに対して slice (1)とやってやると このように2番目と3番目の要素だけが 入った配列が取得できました slice (2)とやれば このように 3番目だけが入ってきます このように sliceメソッドのパラメータには 作りたい部分配列の オフセットを指定します もちろん0を渡せば そのまま 元の配列が帰ってきます では解説の続きです ここでURLだけが入った 配列が作れたので それに対してforEachで 処理をしてきます その中には URLが入っていますね そして各URLに対して HTTPの GETをしましょう getで レスポンスオブジェクトを受け取ります そして レスポンスオブジェクトに対して pipeをして blで結果をまとめあげます これで 各URLに対して データを取得して それをまとめあげる というところまで できました pipeのスペルが 間違ってますね ここで このように console.logと そのまま出力してしまうと これはデータのロードが 並列に実行されるので その完了の順番は 不定 そのためこのように console.log の出力される順番も 不定となってしまって これでは 問題の正解にはなりません そこで一旦 データを入れておくための 入れ物を用意します 私のやり方は このように オブジェクトを用意します そしてデータが取得できたら テーブルという オブジェクトの中に URLをキーとした データを 格納していきます この時点で 文字列に変換しておきましょう そしてテーブルの要素数が 3になったら テーブルの要素数を 取得する簡単な方法は keysでキーだけ取得して その個数を見ることです ここですね ちょっと ここで手を止めて keysメソッドの挙動についても 確認しておきます ノードの インタープリターで たとえば何か オブジェクトを作成します aが1 bが2 cが3という 3つの要素を持った オブジェクトがあったとします このオブジェクトに いくつのkey 要素が 入っているか知りたい場合 その場合には このオブジェの keys というメソッドを 使用することによって 失礼しました オブジェの keysではなく オブジェクトの keysというメソッドでしたね に キーだけ取り出したい オブジェクトを渡します これでこのように キーだけが入った配列が 取得できました これに対して さらにlengthをかけてやれば そのオブジェクトの中に いくつの要素が入っているのか ということがわかります では解説に戻ります ここで  ですから この書き方は 間違ってましたね オブジェクトのkeysに対して テーブルを渡してやると それでテーブルの中に いくつの要素が入っているかがわかります そしてそのテーブルの中に 3つの要素が入ったならば 今回の問題は3つのURLが 指定されるということでしたので 3です これですべてのデータが 取得できたことがわかるので その時に初めて console.logを出力してやります そしてコマンドライン パラメータで 与えられた順番で データを出力するために ここでurlsで 再度ループを増します forEachの function url そしてテーブルの中には URLをキーとするデータが入っていますので ここでこのように console.log の table urlをキーとして渡して このようにしてやれば コマンドラインで与えられた順番で データを 出力することができます これで 正解がかけたはずです 実行してみましょう ちょっと長い プログラムなので もしかすると どこかにミスがあるかもしれません verify の  program.js やはり どこかに ミスがあったようですね 確認します 閉じの丸カッコが ひとつ足りませんでしたね これでカッコの対応関係は OKになったはずです では再度 実行してみます このように すべてのテストが通って 正解  パスとなりました このレッスンでは 並立に取得したデータを 処理する方法について 学びました

NodeSchoolに入学しよう!

NodeSchoolワークショッパーとは、オープンソースで開発されているNode.jsやJava Scriptについて学ぶためのクイズ形式のアプリケーションです。このコースでは、learnyounodeとexpressworksという2つのワークショッパーを通じてNode.jsとExpress.jsの基本的な使い方を学びます。

3時間13分 (24 ビデオ)
現在、カスタマーレビューはありません…
 
ソフトウェア・トピック
Node.js Node.js 0.10.24
価格: 3,990
発売日:2015年04月07日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。