非同期->同期

http://labs.cybozu.co.jp/blog/kazuho/archives/2007/05/coopthread.php

 JavaScript/1.7 の話なので Firefox 限定です。以前、

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

 JavaScript 1.7 なら yield でできるんじゃないかと思いました。

と書いたっきり失念していたのですが、社内で話題になったので実装してみました。

ということはyield使えばきっと
http://d.hatena.ne.jp/amachang/20061129/1164799871
の逆に、最後にcallbackをとる非同期関数を同期化して

Function.prototype.synchronize = function() {
  var args = Array.prototype.slice.apply(arguments);
  var _orig = this;
  return function() {
    _orig.apply(this, arguments.concat(function(data) {
       //...
    })
    yield;
    //...
  }
}
function getDeliciousNetwork(userid, callback) {
  // JSONP call for 'http://del.icio.us/feeds/json/network/'+userid
  ...
}

function getDeliciousPosts(userid, callback) {
  // JSONP call for 'http://del.icio.us/feeds/json/'+userid
  ...
}

みたいなJSONP呼び出し(非同期)を

var network = getDeliciousNetwork.synchronize('stomita')
for (var i=0; i<network.length; i+) {
   print(getDeliciousPosts.synchronize(network[i]))
}

みたいなことが出来るもんだと思って、ちょっとがんばってみたんだけど、難しそう。この前みたいに遅延を使うしかないのかな。