すたらブログ

文系Webプログラマの備忘録

JavaScript: abort()の動作を勘違いしてました

abort()メソッドAjaxを中断する動作について。

勘違いしていたこと

サーバの処理も中断される。
よって、サーバの負荷の軽減に役立つ。

実際は

JavaScript側でサーバからの返信を受け取らなくなるだけ。
サーバ側のことは知ったこっちゃない。

W3C仕様書の記述

『サーバ側に中止を伝える』というような記述はどこにもありません。

検証

サーバ側のPHPで1万回ループさせてその都度ファイルを開いて現在の回数を書き込む、という処理を作りました。

PHP
<?php
for ($i = 0; $i < 10000; $i++) {
    $fp = fopen('count.txt', 'w');
    fwrite($fp, $i);
    fclose($fp);
}

この処理をAjaxで行うと、私の環境では完了までに6秒ほどかかります。
その間にJavaScript側でabort()で通信を取りやめても、PHP側の処理は止まりません。
"count.txt"の中身は"9999"です。
もちろん、6秒以内にテキストファイルを開けば途中の数値が表示されますが、6秒経てば結果は全て"9999"です。

感想

本日、AjaxjQueryに関して講義を行ったのですが、その中で自信満々に『abort()でサーバの負荷を軽減できる!』と説明したのですが、受講者からの質問を受けて勘違いに気づきました (((( ;゚д゚))))アワワワワ
abort()の利点って、JavaScript側で古い返信を処理するムダや混乱を避けることができる、ということだけだったんですね…。

脱線: 今日の講義の反省

今日の講義を反省する中で、このabort()については仕方なかったと考えています。
事前に用語の意味の理解を点検していましたが、このabort()の誤った理解は自分の中では常識となっていたので、全く配慮の外でした…。

それよりも改めて考えさせられたのは、現在受けている講師研修の中で何度も戒められている『相手の理解の時間を妨げてはならない』という言葉でした。
3時間の講義の中で2時間を演習として使い、その間も随時質問を受け付けていましたが、思ったほど質問が飛んできませんでした…。
受講者の皆さんは黙々と課題に取り組んでいる様子だったので邪魔をしてはいけないと思い、2度ほどソースコードの解説をするだけだったのですが、もう少し、教室全体で教えあう雰囲気を作る工夫が必要だったと思います (-_-;)

脱線: 母にタッチ端末の操作方法を教える

博多での講義終了後に北九州市の実家へ帰りました。
そこで母からNexus7(2012)の操作方法についていろいろ尋ねられました。
(私が東京へ出てから、母と毎晩Googleハングアウトでテレビ電話をしているので。)

そこでも、やはりいつも研修で言われている言葉を思い出しました。

  • 相手の言葉を最後までよく聞いてから回答すること。
  • 1から10までこちらが全部説明するのではなく、相手が自分で考えて行動するほうが真の理解につながる。

わかっていても、ついついあれやこれやと教え込もうとしてしまうんですよね…。
講義でもその傾向がありました。
これこそが今後の私の課題ですね。