2016年10月14日

ajaxでのシナリオデータロードにちょっとハマった話

龍の宝珠、少しずつ作成続けてます。ajaxからデータ読み込んでlocalStorageにシナリオデータをキャッシュするところで、
わずかにハマるところがあったので2〜3日程度後の俺のためにメモをとっておく。

シナリオデータをキャッシュして読み込むロジックを作り込んで1週間、テストプレイを重ねて
「ああ〜これいいっすね〜」などと悦に浸っていたわけですわ。
まあそりゃいいさ。今はlocalStorageのキャッシュから黙々とデータを読み込んでいるんだから。
調子に乗ってリファクタリングなんかやってみたのさ




シナリオデータが読み込めない?!

やったことはこんな感じ。

function start_game(){
  if(!localStorage.scenario_ver || localStorage.scenario_ver < VER){
    $.get("scenario/s00.txt", (data)=>{
      let scenes = parse_scenes(data);
      cache_scenario(scenes);
      jump("001");
    });
  }else{
    jump("001");
  }
}
赤文字部分が冗長じゃな〜い? 見通し悪いよね〜?

ここを・・・こうじゃ。

function start_game(){
  if(!localStorage.scenario_ver || localStorage.scenario_ver < VER){
    load_scenario();
   }
   jump("001");
  }
}

function load_scenario(){
   $.get("scenario/s00.txt", (data)=>{
   let scenes = parse_scenes(data);
   cache_scenario(scenes);
}

シナリオをキャッシュしようがしまいがどうせ初回起動時にはシーン001を読み込むんだからif文の外にくくりだせ。
王道だね。でも勘のいい諸兄は気づくでしょう。これ動きません。なぜなら$.get()が非同期で動くから。parse_scenesおよびcache_scenarioを呼び出す前にjump("001")を呼び出しちゃうから

そりゃそうさー。非同期だから、asyncだからajaxっていうんだろーさー!
jqueryとかこういううまい具合に隠ぺいするツール使ってるとついそのことを忘れてしまうね。
あーびっくりした。当然もとのロジックに戻しましたとさ。

でもどうすればいいわけ?

ただこうするとリファクタリングしたかった本来の意図は果たせないんだけどさ、
これ本当はどうすればいいんだろうね?
ajaxの結果を待ち合わせる関数とかないもんだろうか。Ajax.join();みたいに。ねえのか。ajax側になんかロックオブジェクト更新させて、メインスレッドでそいつを監視すればいいのかな。
あああ、リファクタリングごときでそんな大掛かりなことしたくねぇ。開発者の気持ちいい・悪いの都合でそんな大改造していいの?

まあ、どうせユーザーも俺一人なんだけど
(いいオチがつきました)
posted by LoyalTouch at 06:54| Comment(0) | TrackBack(0) | ゲーム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/442787514

この記事へのトラックバック