1. ホーム
  2. javascript

[解決済み] Dojo: すべての xhr / ajax 呼び出しが同期化され、他の呼び出しをブロックしているように見える

2022-02-15 07:46:58

質問

引き継いだCRMの作業をしています。長い話ですが、PHPスクリプトを呼び出すボタンがあり、これはバックグラウンドで実行され、応答を待つ必要はありません。

request(idata+'transferInTimeExec.php',{
    sync: false,
    preventCache:true,
    method:'GET'
});

では、その transferInTimeExec.php このスクリプトは、人材紹介会社の毎週のタイムシートを処理し、それを処理し、多くのDBオペレーションを行うという非常に複雑なものです。

Chromeを使用。実行するボタンを押すたびに、終了するまですべてのxhrコールがブロックされます。CRMはquot;ajax heavy"で、スクリプトの実行中、ユーザーは何もできず、別のサブページに移動しても、開始したプロセスが終了するまでxhrリクエストは解決されません。新しいブラウザのタブを開いて何かをしようとしても、それができません。スクリプトの実行中に別のブラウザ(Firefox)でCRMを開くと、CRMを使用することができます。

Networkタブでは、最初のものは保留中で、それに続く別のAjax呼び出しはすべて待機しているのがわかります(すべてsync:falseです)。

さらに、ロジックをすべてPHPの関数に置き換えてみました。 sleep(30) 30秒間何もせず、何も返さないようにしましたが、同じ問題です。

XHRをプレーンなjavascriptで試してみました。 onClick をDojoのメソッドではなく、ボタンのHTMLマークアップ上で使用することで、同じ問題が発生します。

プロジェクト全体に対して、残酷な検索と置換を行い sync:truesync:false - は何も変わりません。

私はアイデアを使い果たしました、多分ここで誰かがこれを解決するのを助けることができますか?同期/非同期のためのグローバルスイッチはありますか?Ajaxの問題でないなら、他に何が考えられますか?

解決方法は?

スクリプト transferInTimeExec.php はセッションを使用していると思われます。その場合、他のAJAXコールは開始せず、セッションデータを上書きしないように、このAJAXコールが終了するのを待ちます。AJAXコールを非同期に設定しても、動作は変わりません。

このスクリプトの実行に1時間かかる場合、UIからAJAXとして呼び出すのは悪い考えです。Cronをセットアップして、毎時間または毎日、バックエンドですべての処理を実行する必要があります。もちろん、セッションを使用している場合は、スクリプトに何らかの調整を加える必要があります。

EDIT

を使用することができます。 session_write_close(); をスクリプトの先頭で使用します。これは、このスクリプトはセッションに何も書き込まないので、 他の AJAX コールが自由にセッションを使用できることを PHP に伝えるものです。しかし、この後にセッションに何も書き込まないように注意してください。