2006-11-29
関数を非同期化して汎用性を高める
関数を非同期化する関数を作ってみた。
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 には非同期メッセージを同期化する方法はない!残念!><ほんとに残念!
トラックバック - http://d.hatena.ne.jp/amachang/20061129/1164799871
リンク元
- 83 http://reader.livedoor.com/reader/
- 56 http://b.hatena.ne.jp/
- 51 http://d.hatena.ne.jp/
- 35 http://www.google.co.jp/ig?hl=ja
- 25 http://b.hatena.ne.jp/entrylist?sort=hot
- 19 http://www.google.com/reader/view/
- 15 http://b.hatena.ne.jp/hotentry
- 10 http://d.hatena.ne.jp/higayasuo/
- 9 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/amachang/20061129/1164799871
- 7 http://b.hatena.ne.jp/add?mode=confirm&title=IT%u6226%u8A18 - %u95A2%u6570%u3092%u975E%u540C%u671F%u5316%u3057%u3066%u6C4E%u7528%u6027%u3092%u9AD8%u3081%u308B&url=http://d.hatena.ne.jp/amachang/20061129/1164799871
