2日目
おさらい/あった声
とりあえずESの授業です。
Q. Node.js事例がみたい
みてみよう
Q. Node.js触れてみたい
Node.jsのインストールをしてみよう
- 僕がMacを買い換えてすぐにいれるツール&すぐにする初期設定【2016年9月版】
- 午後はNode.jsでサンプル動かしてみましょうか
Q. API使いたい
- 今日少しやってみましょう
全体的に期待値が違いそう(苦笑)
非同期処理続き
ポイント:
- Promiseの仕組みを覚えるというよりも、次世代の標準/今風な書き方を捉える。
- これからのライブラリはPromise対応してるものが基本になる
演習: 普通の関数をPromise化
天気API http://weather.livedoor.com/weather_hacks/webservice
- 1. httpリクエスト作ってみます
- jqueryでもOK
- ヒント https://www.html5rocks.com/ja/tutorials/file/xhr2/
- 例: ジーズアカデミーのサイトの情報を抜き出してみよう
- 2. 同期的な実行にする
- 二つ作ってみます
- 3. Promise化して同期的な実行にする
STEP1: 自分の地元の天気の情報を取得してみましょう
天気API: http://weather.livedoor.com/weather_hacks/webservice
ヒント:
jQueryなら$.ajax()を使う
axiosとかもおすすめ
cross domainを超えるためのjqueryライブラリ
const http = require('http');
const AREA = `030010`; //盛岡
const AREA2= `400040`; //久留米
const BASEURL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=`;
const URL1 = BASEURL+AREA;
const URL2 = BASEURL+AREA2;
//1個目のリクエスト
http.get(URL1, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', (res) => {
res = JSON.parse(body);
console.log(res.forecasts[0]);
});
}).on('error', (e) => {
console.log(e.message); //エラー時
});
STEP2: 二つのリクエストを同期的に行う
const http = require('http');
const AREA = `030010`; //盛岡
const AREA2= `400040`; //久留米
const BASEURL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=`;
const URL1 = BASEURL+AREA;
const URL2 = BASEURL+AREA2;
//1個目のリクエスト
http.get(URL1, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', (res) => {
res = JSON.parse(body);
console.log(res.forecasts[0]);
//二個目のリクエスト
http.get(URL2, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', (res) => {
res = JSON.parse(body);
console.log(res.forecasts[0]);
});
}).on('error', (e) => {
console.log(e.message); //エラー時
});
});
}).on('error', (e) => {
console.log(e.message); //エラー時
});
STEP3: 関数化
const getTenki = (url, callback) => {
http.get(url, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', (res) => {
res = JSON.parse(body);
// console.log(res.forecasts[0]);
callback(res.forecasts[0]);
});
}).on('error', (e) => {
console.log(e.message); //エラー時
});
// return `hogehgoe`;
}
getTenki(URL1,(res)=>{
console.log(res);
getTenki(URL2,(res2)=>{
console.log(res2);
});
});
STEP4: promise化
const getTenki = (url) => {
return new Promise((resolve, reject) => {
http.get(url, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', (res) => {
res = JSON.parse(body);
resolve(res.forecasts[0]);
});
}).on('error', (e) => {
reject(e);
console.log(e.message); //エラー時
});
});
}
getTenki(URL1)
.then((res)=>{
console.log(res);
return getTenki(URL2);
})
.then((res)=>{
console.log(res);
return getTenki(URL3);
});
Tips: jQuery+ブラウザでやる人
ChromeはCORS対策のアドオンをいれておくと開発が楽に進みそう
JSONを見やすくする拡張
-> https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ja
<html>
<head></head>
<body>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="app.js"></script>
</body>
</html>
'use strict';
const AREA = `030010`;
const URL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=${AREA}`;
$.ajax({
url: URL
}).done((res) => {
console.log(res.forecasts[0]);
});
ジェネレータ/yeild
参考: generatorとJavaScriptの非同期処理
http://qiita.com/hitsujiwool/items/316f3e8a41fb7dc3a119
Async/Await
参考: Promiseとasync/awaitでJavaScriptの非同期処理をシンプルに記述する
https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/
色々なライブラリを眺める
- axios
- fetch
ここまで午前の予定
午後
classの紹介
- MDN https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes
- HX https://html5experts.jp/takazudo/17355/
演習: ES5のJSをES2015(2016)に直してみよう
- 過去ののびすけコード: http://qiita.com/n0bisuke/items/9e09a18793217c2d97da
- その2; http://qiita.com/n0bisuke/items/dd537bd4cbe9ab501ce8
今日のまとめ
- 非同期処理続き
- リクエスト
- promise形式のライブラリになれる
取り扱わなかったもので覚えておきたいもの
map/set
- map
- set
- weakmap
- weakset
以前から JavaScript を使っている人はマップ(Map)が使える場面でもオブジェクト(Object)を 使ってしまうことがあるかもしれません。そしてオブジェクトを使う場合に注意しなければならな い点も心得ていることと思います。しかし ES2015 からは本当のマップが利用できますから、これを 利用しない手はありません。また、セット(Set)が使えるところでブール値を値としてもつオブジェ クトを使う方法にも慣れていることと思います。しかしセットが標準で使えるようになったのですか ら、これを利用しましょう。オブジェクトを使おうと考えたら、もう一度マップやセットが使えない か考えてみる癖をつけるとよいでしょう。
モジュール
import文
イテレータ/ジェネレータ
ES2015 では「イテレータ(iterator)」と「ジェネレータ(generator)」という、2 つの重要な概念が 新たに導入されました*1。ジェネレータはイテレータに依存しますので、まずイテレータから説明し ていきましょう。