更新: jQuery Ajaxリクエストにはpromiseインターフェースがあるため、進捗情報の取得がはるかに簡単になります。この答えを使用してください:
https://stackoverflow.com/a/32272660/18771
以下の元の回答は古くなっています(元々は2010年のものです)。それでも機能しますが、必要以上に複雑です。参照と比較のためにそのままにしておきます。
サーバーからのある種の進捗情報が必要です。ajaxコールバックはプログレッシブ作業を行わず、リクエストが正常に返された後、1回だけ起動します。
したがって...PHPでは次のようなものが必要になります。
/* progress.php */
$batch_done = some_way_to_find_out_that_number();
$batch_size = some_way_to_find_out_that_number_too();
header('Content-type: application/json');
// TODO: format number
echo '{"progress":'. ($batch_size==0 ? '0' : $batch_done*100.0/$batch_size).'}';
これが機能するためには、画像処理スクリプトはもちろんその進行の証拠を残す必要があります。
そしてJavaScriptでは次のようなものです:
$(document).ready(function() {
$('a.loop').click(function() {
var queryData = {foo:"bar"};
// prepare a function that does cyclic progress checking
var progressCheck = function() {
$.getJSON(
"progress.php", queryData,
function(data) {
$("div.progress").css("width", data.progress+"%");
}
)
};
$.post(
'loop.php', queryData,
/* create the post request callback now */
function(intvalId){
return function(data) {
$("div").html(data);
clearInterval(intvalId);
}
}( setInterval(progressCheck, 1000) )
);
return false;
});
});
この部分にはいくつかの説明が必要です。
function(intvalId){
return function(data) {
$("div").html(data);
clearInterval(intvalId);
};
}( setInterval(progressCheck, 1000) )
function(intvalId)
は、1つの引数(間隔ID)を受け取る無名関数です。このIDは、を介して設定された間隔を停止するために必要setInterval()
です。幸いなことに、への呼び出しsetInterval()
はまさにこのIDを返します。
匿名の外部関数は内部function(data)
を返します。これはの実際のコールバックになります$.post()
。
すぐに外部関数を呼び出し、プロセスで2つのことを実行します。1つは間隔をトリガーしsetInterval()
、引数として戻り値(ID)を渡します。この引数値は、呼び出し時に内部関数で使用できるようになります(将来的には数分になる可能性があります)。今のところコールバックpost()
は実際に間隔を止めることができます。
あなたのための練習として;)
- リクエストエラーまたはタイムアウト時にもインターバルを停止するようにajax呼び出しを変更します。現在、コールバックが実行されない場合(そして、成功した場合にのみ実行されます!)、間隔は停止しません。
post()
を誤って2回トリガーできないようにしてください。