0

ユーザーが順番に見る一連のフォームがあります。ユーザーがフォームを送信すると、送信された値に基づいて重い作業を行う PHP ファイルに送信されます。実行には 10 秒以上かかる場合があります。次のフォーム。

PHP が終了するのを実際に待つ必要はないので (続行するためにその結果は必要ありません)、送信時にユーザーを次のページにリダイレクトし、バックグラウンドでフォームを送信することは可能ですか?それはユーザーを遅くしませんか?

Javascript setTimeout() がスレッドを模倣できると聞いたことがあります。これは並行して実行するためのオプションですか?

私の JS 関数goNext()は、ユーザーを次のページにリダイレクトします (ただし、送信しません)。それで、このようなものは機能しますか?

$('#submitButton').click(function() {
    setTimeout(submitForm(), 1);
    goNext();
});

function submitForm() {
    $('#form').submit();
}
4

3 に答える 3

0

すべてのHTTPリクエストはレスポンスを受け取ります。したがって、リクエストが機能したことを通知するには、サーバーから適切な応答(200)を取得する必要があります。

あなたが提案していることをするためには、これをサーバー側で処理する必要があると思います。

于 2012-06-07T21:42:23.993 に答える
0

ajax を使用して、フォームを非同期で処理します。jQuery のようなライブラリを使用すると、データが返されたときに呼び出されるコールバックも使用できることを知っています。ライブラリがなくてもこれを行うことができますが、ライブラリがあると作業が簡素化されます。

彼らのウェブサイトから:

$.ajax({
  url: 'ajax/test.html',
  success: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});

(呼び出しはデフォルトで非同期です)

ライブラリがなくても、次のようなことができます。

var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    alert('Ajax returned';
    }
  }
xmlhttp.open("GET", "some_url.txt",true);
xmlhttp.send();

xmlhttp.onreadystatechange=「コールバック」関数を設定する場所ですが、通常の JavaScript を使用すると、準備完了状態が実際に成功準備完了状態であるかどうかを確認する必要があります (例のように)。

于 2012-06-07T21:44:40.447 に答える
0

いいえ、これはうまくいきません。ユーザーがページを離れると (フォームを送信するなど)、JavaScript は終了し、次のページの読み込みで新しい JavaScript コンテキストが作成されます。JavaScript だけでは、変数やタイマーをリクエストに永続化することはできません。

これには ajax を使用できますが、すべてが同じページで発生し、フォーム データを送信して処理が完了するのを待つ ajax 呼び出しを使用する場合、ユーザーが誤ってページを閉じたり、ajax 呼び出しが待機している間に別の場所に移動した場合、処理が中断されます。中止されます。

より良い解決策は、サーバー上でアップロード、処理、およびレポートの部分を分離することです。これは、次のように設計できます。

  • サーバーにタスク キューを設定します。これに対する従来の選択は、データベース テーブルです。プロセスは、処理が必要なアップロードごとにレコードを追加し、ステータス (新規、作業中、完了) を示すように変更します。
  • アップロード ハンドラーは、アップロードされたファイルを読み取り、それをタスク キューに追加するだけです。それが完了すると、ユーザーは安全に移動できます。
  • 処理する新しいタスクがあるかどうかを定期的に確認する cron ジョブまたはワーカー プロセスを実行します。存在する場合は、1 つを取得し (ステータスを「作業中」に設定)、処理し、完了したら更新します。
  • その間、Web アプリケーションはジョブの ID を記憶し、そのステータスについてサーバーをポーリングします。「完了」に変わるとすぐに、ユーザーに通知します(フィードバックが必要な場合)。Ajax はこれを行うための最もスムーズな方法を提供します。そうしないと、ユーザーはアップロードのステータスを確認するために時々更新する必要があります。
于 2012-06-07T21:47:37.863 に答える