OperaでJSONPを非同期リクエストする

JSONP が Opera だと非同期処理できない
http://d.hatena.ne.jp/secondlife/20060906/1157515075

に書かれているとおりOperaだとscript要素を足した瞬間にJavaScriptの実行が止まって、ロード完了まで後続のスクリプトが実行されなくなります。

サンプル
http://la.ma.la/misc/js/opera_jsonp_test.html

そこで、リクエストの度にダミーのIFRAMEを作って、そのIFRAME内のcontentWindowで実行するという方法を試してみました。
IFRAME内でJSONをロードするサンプル
http://la.ma.la/misc/js/iframe_jsonp_request.html

なんかIEで動かないっぽいけど気にしない。相変わらずタイマーは停止しますが、appendChildした後のscriptも実行されます。ただIFRAMEを生成する分遅くなっていまいちな感じです。で、一見並列でリクエストされているように見えるのですが、コネクションを見張ってみたら、最初のscriptがロード完了するまで次のscriptを読まない、リクエストすらしていないようでした。

そして色々考えた結果、script要素を追加するタイミングをsetTimeoutでずらしてやればいいんじゃないかと言うことでやってみたのがこれ。
http://la.ma.la/misc/js/jsonp_request_with_delay.html

ディレイなしだとスクリプト追加直後に書いたコードが、外部スクリプトのロード後に実行されてうまく動かないけれど、ディレイを入れるとうまく動く。他のブラウザではどちらでも問題は無し。

非同期と言えるかどうかは微妙だけど、読み込み完了まで何も実行されない、という状況はある程度回避できそう。

まとめると
- Operaではタイマーが止まるのでタイムアウトを処理するのはなんか無理っぽい
- IFRAME使ってもscriptは順次読み込まれて、並列にリクエストされることはない
- script挿入のタイミングをずらしてやればコネクション数の管理なんかはできる

これぐらいか。

IFRAMEの中で処理する方法は、IFRAME内で実行されて名前空間が分かれるのでコールバック関数名を共通にできる(ユニークなIDをつけなくてもいいので、ブラウザのキャッシュが効きやすい)っていうメリットがあるんだけど、その他もろもろのデメリットを考えると大したメリットでもないかなーという具合。


WriteBacks

日報/2006-09-06

2006-09-06 ▲ ▼朝 ▲ ▼09:58 到着 久々にスタバのアイスコーヒー ラテより早くて良いな 今日は久しぶりにずっと在席していられるし ▲ ▼午前 ▲ ▼10:00〜10:07 メール、サイボウズ とりあえず大した話は無し 脇机見付かった ってアレ自分のかな? ▲ ▼10:07〜10:12 本日のお仕事 Director止める 同時にweb1を復活させてこないと BestSellersがエラーになる件の調査 db1の部品交換は今日行われるのかな? やれるテストをやる Hinemosのdb関連監視項目整備 ログバックアップ中プロセスダウンなどの障害試験 ▲ ▼10:13〜10:42 さて今日生きているマシンは web2が死んでおる 昨日死んだweb1もそのまま DirectorAgentを落として回る なんかstart-stopスクリプトが固まるプロセスがあるなあ 勘弁してよ つうか「OK」が出てから戻ってこないというのはどういう了見だ chkconfig --level 345 $serv off して回る mng1以外 HinemosでDBサーバの監視設定を確認するか と思ったがちょっとbloglines(ぉぃ あんまり目新しい話は出てこないなあ 薩美さんからのメール 9/25からで確保完了 これで9/22が最終日じゃなくなったか(ぉ ▲ ▼10:42〜10:57 優先してやる仕事は? APサーバのエラー Hinemosの設定更新 そもそもHinemosの設定更新はどこまでやる必要があるんかいな という話 プロセス周りを見直してみたが postgres: logger processがdb0に無い heartbeat: read/write がふたつある(Webと同じ状況) そんなところか で 優先してやる仕事は? 松田さん的にはAPサーバのエラーなんだろうな まあそこからやるか…… と思ったら web1もweb2も死んでたらVIPでHTTPアクセスできないじゃんw web3を叩くか WebもAPも自分でサービス上げて回るのはだるい(ぉ どうせならweb1/web2も復活させてからかな こりゃ ▲ ▼10:57〜11:15 どうせ時間かかるAPの調査は午後 Hinemosの項目確認は今やるか ってそーいえば HinemosAgentのインストールはdb0はまだかな? 入れた ついでにdb2もあわせて ログ出力位置がおかしかったのを直した ▲ ▼11:15〜11:42 しょうがないからweb1/web2を上げてくるか 席にいないとさw 薩美さんから更新済みスケジュール 確認 良さそうだな 松田さん来るし あとで確認とっておくか マシンルーム入りしてweb1とweb2をハードリセット 起動してきたが ログには落ちた原因が何も無いな 戻ったらとりあえずDirectorを落とした chkconfigも実行 okかな ▲ ▼昼 ▲ ▼11:42〜12:11 いやし屋(だっけ?)でざるそばといくらご飯 夏休みの話が そういや俺もあと3日どこでとろうw ▲ ▼12:11〜12:48 bloglines AP4Rかぁ。使えるのかな。 あーでもアーカイブ出力とかこういうのに放り出せるかな? Rails上で動かすように書いたロジックが実行できるのかどうかが気になるけど ▲ ▼午後 ▲ ▼12:48〜14:21 さてと HinemosServerのPostgresが動いてないんだっけ postmaster.pidが残っていたようだ なんでやねん 削除して再起動 起動スクリプトがお粗末だなあ まあいーけどさ さてHinemosの機能確認 db0/2の追加も db2のプロセス数が全然見えていない あぁNetSNMPのコンパイル方法が云々って話だったっけ ということでコンパイルし直し 見えるようになった っと 中平さんがAPサーバのデータに突撃 ほうっておこう(ぉぃ HP側に切り替えても症状変わらないらしい(ぉ ファイルの存在/非存在 ログ、セッションファイル、コンパイル済みjspくらいしか違わない 関係のありそうなxmlファイル全部に対してdiffを取ってみた セッションレプリケーションまわりの設定 と IPアドレスや性能関連パラメータ くらいしか違わない しょうがないからtpcwのソースを読む NullPointerExceptionの原因になっている引数の取得が問題なんだろうな ActionFormを取得する関数らしい struts-config.xmlでは notFoundSCR には name="" が与えられていない その場合の例外処理がされていないのが問題 だな struts-config.xmlに name="" を追加 パラメータは無いのでForm名はテキトー とりあえずぬるぽにならずにnotFoundな画面が出るようになった ▲ ▼14:21〜15:49 さてtpcwでnotFoundになる理由の調査 ソースを読んでみると 検索結果のレコード数が0だと notFound に飛ばされるらしい ……いや、それおかしいだろ。 まあそれはそれとして叩いているSQL文を眺める そのまま実行してみてもPostgreSQL上でエラーになる おっかしーなーと修正しながら実行してみたら0件に。0件? apサーバ上には既にPostgreSQL用に修正されたsql.propertiesが置いてあったヨ 不要なまでに複雑なクエリだが 要するに元になっているテーブルのレコード数が0だ 中平さんにどうやってデータを作ったか聞いてみる 手順書が出てきた ふむぅ なんか手順書どおりにやれば大丈夫そうに見えるけどな よくわからん いったん休憩 とりあえず中平さんにはもう一度手順書どおりにデータを作り直してみてもらうようお願い 再現したらスクリプトを精査しよう だらーっとBloglines(ぉぃ TPC-Wのエラーに関する顛末を書いてMLへ投げる 投げた ▲ ▼15:49〜16:24 db1の修理 修理の人が部品持ってきたところ「再現しなかった」 by 平川さん すげー信じられねーw 明日またインストールやり直してみるか さてあとは Hinemos? db1を現在のdb1に向け直してdb0を新設した さて正常に値が取れるかな? 他にやること何があったっけ snmpdダウンの試験を地道にやっていくことにする ちまちま と思ったがHinemosの検知イベントが溢れている予感がするので全削除 吉岡さんからのメール アーカイブでディスクが溢れる……そういえばそんなこともあったなあ。はるか遠い昔のことのようだ。w ▲ ▼16:24〜 snmpダウン試験 と思ったがHinemosがなにやら反応してくれません マジ困るなあ 反応するようになったので試験開始 web1/2/3から イベント検知待ちに読んだ OperaでJSONPを非同期実行する なんていうか、ほんとによく考えるなあ

Posted by PukiWiki Plus! (PukiWiki/TrackBack 0.3) at 2006/09/06 (Wed) 16:39:00

Weekly Builds (2006-09-08)

<p>Missed us? - Desktop Team - by Desktop Team</p><p>出ましたっ! 久々のWeekly Builds。もはやWeeklyでもなんでもないですが、そんなことはどうでもいいのさ。</p><p>Windows版はヴァージョン9.02 Build 857 ...

Posted by ノヴム・オペラヌム at 2006/09/09 (Sat) 02:20:47

こんなすごいサイトを見つけました!

こんなすごいサイトを見つけちゃいました。

ハッキリ言って大発見です!

http://www.1happy-net.com/nanpabicban.html

Posted by こんなすごいサイトを見つけました! at 2006/09/18 (Mon) 11:03:52

Operaがサポート予定

はじめまして。いつも読者としてお世話になっています。
この件ですが、ウチでやっているLingr.comでも問題になっていたのでOpera Teamにレポートしたところ、「この件は他のブラウザにあわせて修正したい」との回答がきました。
このレポートの際に、malaさんのここにあるサンプルを使わせていただきましたので、そのお礼を述べに来ました。実際、先方でのReproに即席で役立ったと思います。ありがとうございました。
LDRユーザとしてもご活躍を楽しみにしてます。ではまた。

Posted by kenn at 2007/01/09 (Tue) 02:14:01

IMGとして取得させキャッシュに入れる方法

こんにちは。

JSONPのリソースを一度IMGタグから取得させてブラウザのキャッシュに入れておき、その後SCRIPTの要素として同じURLを再取得する、という方法が使えるかもしれません。

1.JSONPのリソースをIMGタグの追加などで取得する(このとき、あらかじめエラーハンドラを別の関数に設定しておく)
2.画像ではないのでエラーになる
3.エラーのイベントハンドラが呼び出されたらSCRIPTタグの追加で再度同じリソースを取得する
4.このときレスポンスは既にキャッシュに入っているため、一瞬で取得が終わる(限りなく非同期ぽい同期処理)

JSONPのレスポンスヘッダにPragma: no-cacheなどの指定があると動かない可能性が高いです。

だいぶ前に一度手元で実験したのですが、その後まとめきれずにいます。
おそらくFirefox(とOpera)で動作しますが、IEではこの方法は使えません。
デモも用意せずにすみませんが、時間がありましたらぜひ試してみてください。

Posted by 金床 at 2007/04/04 (Wed) 23:41:55

Operaでも非同期リクエストが並列処理できる img-JSONP

先日金床さんに教えてもらったOperaで非同期並列JSONPを実行させる方法を...

Posted by TAKESAKO @ Yet another Cybozu Labs at 2007/06/05 (Tue) 18:39:43
TrackBack ping me at
http://la.ma.la/blog/diary_200609061514.trackback
Post a comment

writeback message: Ready to post a comment.







spam yoke. nanimo ireruna.