IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

関数を非同期化して汎用性を高める

関数を非同期化する関数を作ってみた。

Function.prototype.asynchronize = function() {
  var f = this;
  return function() {
    var resultcb = function() {};
    var failcb = function(e) { throw e };
    if (typeof arguments[arguments.length - 1] == 'function') {
      resultcb = Array.prototype.pop.apply(arguments);
      if (typeof arguments[arguments.length - 1] == 'function') {
        failcb = Array.prototype.pop.apply(arguments);
      }
    }
    try {
      var result = f.apply(this, arguments);
      setTimeout(function() { resultcb(result) }, 0);
    }
    catch (e) {
      setTimeout(function() { failcb(e) }, 0);
    }
  };
};

何が嬉しいのか?

たとえば、以下のようにデータを cookie に保存する場合があって

function putData(data) {
  data = escape(data);
  if (data.length > 5000) throw Error('データが大きすぎるよ><');
  document.cookie = 'data=' + data;
  return 'ok';
}

こう使うとする

var result = putData();
if (result == 'ok') {
  ...
}

しかし、途中でデータをサーバに保存するように変更したいとかとか。
非同期処理にしたくて困る><

var reuslt = putData(); // 非同期なので
if (result == 'ok') {   // 結果より先に処理が先に流れてしまう。
  ....
}

なので、将来サーバに任せるかも知れない処理とかは、非同期化しておくと便利かもしれない。
こんな感じ

putData.asynchronize()(function(result) {
  if (result == 'ok') {
    ....
  }
});

逆も出来たら便利だと思うのだが

残念ながら、JavaScript には非同期メッセージを同期化する方法はない!残念!><ほんとに残念!