JSONPの呪い再び(ドメインをまたいだ外部テキストデータの取得)
ゲームブックアプリちょっと参っています。
新しいゲームブックシナリオを、テキストあるいはURLを指定してネットから取り込む処理を書いていて、うまく行ったなあとテストをしていたのですが、なぜか二回目のネットから取り込みにエラーが発生します。
やっていることは、2022/07/23の記事の部分なんですが
外部データ取り込み色々テスト中9 外部データの取得(利用できる形で)成功!
https://ncode.syosetu.com/n5283hn/138/
色々調べていくと、暗黙のコールバック関数名が初回は”g_jsonp_callback_0”で問題なかったのが、2回目以降は”g_jsonp_callback_1”、”g_jsonp_callback_2”と末尾の数字が増えていくことを発見。
そもそも、この部分は対症療法的解決策で、十分に理解して書いていた訳じゃないので調査する必要があります。
まあ、最悪スクリプトでリロードさせるという方法もある訳ですが・・・
追記:
多分、これだ!と言う記述を発見
https://github.com/angular/angular/blob/main/packages/common/http/src/jsonp.ts
------------------------------------------
/**
* Get the name of the next callback method, by incrementing the global `nextRequestId`.
*/
private nextCallback(): string {
return `ng_jsonp_callback_${nextRequestId++}`;
}
------------------------------------------
return `ng_jsonp_callback_${nextRequestId++}でnextRequestIdを1増加させています。
これはリロードさせるのが安全かな・・・
注釈と日本語訳(Google)
// Every request made through JSONP needs a callback name that's unique across the
// whole page. Each request is assigned an id and the callback name is constructed
// from that. The next id to be assigned is tracked in a global variable here that
// is shared among all applications on the page.
// JSONP を介して行われるすべてのリクエストには、全体で一意のコールバック名が必要です
// 全てのページ。 各リクエストには ID が割り当てられ、コールバック名が作成されます
// そこから。 次に割り当てられる ID は、グローバル変数で追跡されます。
// ページ上のすべてのアプリケーションで共有されます。
追追記
URLからのデータ読み込み時は再起動するように変更。
環境にもよると思いますが、ほぼストレスなしで読み込めそうです。
http://ajax-python.sakura.ne.jp/gamebookmaker/home
(HTTPSでは無いので、クリップボードイベントと使用メモリー量取得は使えません)