GM_xmlhttprequestを同期処理っぽく?使ってみたい
10個くらいURLがあって、その中の一つにだけ欲しいデータがあります。そのデータさえ得られれば他のURLにアクセスしなくても良いですし、サーバ側に負荷をかけてしまうので、URLを一つ一つ順番にアクセスしていきたい(ある1つのURLにだけアクセスし、中身を検証し、正解でなかったら次のURLにアクセスしたい)。
というシチュエーションに遭遇しておるのですが、こういうコードでええもんなんでしょうかね。クロージャを単方向リンクでつないでいく方法。
var queries = [ {method : "GET", url : "http://yahoo.com" }, {method : "GET", url : "http://google.com" }, {method : "GET", url : "http://asahi.com/" } ]; function handler(q, next){ q.onload = function (res){ GM_log(res.responseText); next() }; GM_xmlhttpRequest(q); } var fchain = function(){}; for(var i = queries.length - 1; i >= 0; --i){ fchain = (function(q, next){return function(){handler(q, next);};})(queries[i], fchain); //(A) } fchain();
実際のコードはハンドラ関数もthisも引数として渡してるので、(A)の行は以下のようになっちゃうのですが。
fchain = (function(f, ctx, q, next){return function(){f(ctx, q, next);};})(f, this, q, fchain);
もっと読みやすく簡潔な方法が確立されているような気がするんですが、どうなんでしょ。