DxOpalのファイル読み込みクラスを作ってみた

前回のDxOpalでのマップファイル読み込みの件。結局XMLHttpRequestでなんとか読み込んでいたんだけどJavaScriptむき出しはなんなのでファイル読み込み部分をモジュール化しておこうと思う。
せっかくなのでDxOpalのコードを参考にRemoteResourceクラスとやらを継承して汎用のクラスを作ってみる。エラー処理は省略。

class Text < RemoteResource
  RemoteResource.add_class(Text)
  attr_accessor :str

  # Load remote text (called via Window.load_resources)
  def self._load(path_or_url)
    txt = new()
    txt_promise = %x{
      new Promise(function(resolve, reject) {
        var request = new XMLHttpRequest();
        request.open('GET', #{path_or_url}, true);
        request.responseType = 'text';
        request.onload = function() {
          txt['$str='](request.response);
          resolve();
        };
        request.send();
      });
    }
    return txt, txt_promise
  end
end

使い方は以下。

Text.register(:sample, 'sample.txt')

Window.load_resources do
  puts Text[:sample].str
end

load_resources後にファイルの非同期読み込みが完了していて中身が参照出来るようになる。

0