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