関数を非同期化する関数を作ってみた。
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 には非同期メッセージを同期化する方法はない!残念!><ほんとに残念!