Я пытаюсь подготовить подтверждение концепции для страницы, которая будет принимать файл, который выбирает пользователь, обрабатывать и возвращать его, все время сообщая о состоянии процесса. Я думал, что лучшим решением для этого может быть потоковая передача по HTTP, однако я могу заставить его работать только в Firefox (не в Chrome или IE8.)
load.js
$(function() {
var xhr = $.ajax({
url: '/nph-handleRequest.cgi'
,type: 'get'
});
collectPartial(xhr,'');
});
var collectPartial = function (xhr,lastContent) {
alert(xhr.readyState);
if (xhr.readyState == 3 && lastContent != xhr.responseText) {
lastContent = xhr.responseText;
alert(xhr.responseText);
}
if (xhr.readyState < 4) {
setTimeout(function() {collectPartial(xhr,lastContent)}, 1000);
}
}
НПХ-handleRequest.cgi
#!/usr/bin/perl
$|=1;
print "$ENV{SERVER_PROTOCOL} 206 Partial Content\n";
print "Server: $ENV{SERVER_SOFTWARE}\n";
print "Content-type: text/plain\n\n";
for ($count = 1; $count < 5; $count++) {
print time();
print "\n";
sleep(2);
}
В Firefox предупреждение (xhr.readyState) продолжает отображать 3, как я и ожидал. В Chrome, правда? 1. В IE это 2. Ни один не позволяет мне получить доступ к responseText либо.
Любые предложения относительно того, что я делаю неправильно, будут с благодарностью.
Редактировать 1
На самом деле это MiniServ, а не Apache. Сервер, похоже, не является проблемой, поскольку он работает в одном браузере, а не в другом.
Редактировать 2
После обнаружения CGI :: Push я попытался использовать это, несмотря на предупреждения, что это не работает в IE. Как ни странно, он работал в IE8 (не идеально), но все еще не в Chrome.
#!/usr/bin/perl
$|=1;
use CGI::Push qw(:standard);
do_push(-next_page=>\&display_time,-delay=>2);
sub display_time {
my($q,$counter) = @_;
return undef if $counter > 5;
return time()," "x256, "\n";
}