ひっさしぶりにAjaxのコードを書こうとあれこれみていて、また知らなかったことが出てきた。
fetch
新しいHttpリクエストをあげるJavascriptの命令。
イマドキらしくpromiseを継承しているから、コールバック関数じゃなくthenで待つ。
先日書いたように、非同期通信をjavascriptでやるにはpromiseの理解が必須となってます。
で、ここからが本論。
ネットでxmlhttprequestを話題にしている人の90%くらいはjqueryのAjaxを使って理解できたことにしている。
xmlhttprequestで書いて理解しているわけじゃない。
だからJQueryのAjaxの中身が実はfetchに代わっていても意味はわからないまま使い続けるだろう。
それが私みたいにwebアプリをいつも書いているわけじゃない人間ならいいけど、仕事で毎日のようにwebアプリを書いている人間だったらみっともないことになるよね、と思う。
さて使い方サンプル。hiddenパラメーターにメアドをセットしてある。ボタン押したらfetchでサーバーに飛ばして結果をテキストで受け取って、innnerHTMLで表示するだけ。エコーバックみたいなもの。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Async Test</title> </head> <body> <p>Hello World</p> <form name="fm"> <input type="hidden" name="mail" value="hogehoge@gmail.com"> <input type="button" name="submit" value="警告" onClick="asyncDo();" /> </form> <div id="result"></div> <script> function asyncDo(mail){ var mail = document.fm.mail.value; fetch('http://localhost/async.php?name='+mail) .then(response => { return response.text(); }) .then(mail => { document.getElementById("result").innerHTML = mail; }); }; </script> </body> </html>
サーバーのPHP側ももらったデータをprint文で返すだけ。
<?php if ($_SERVER["REQUEST_METHOD"] == "POST"){ $name = isset($_POST["name"]) ? $_POST["name"] : "unknown"; }else{ $name = isset($_GET["name"]) ? $_GET["name"] : "unknown" ; } print($name);
今回のサンプルはブラウザーからリクエストがあがったらサーバー側でお仕事してもらって結果のみを返すものだから、ワタシ的にはこれでプロトタイピング終了。
fetchってすごい便利じゃないですか?