Этот javascript setTimeout очень странным образом взаимодействует с ajax-запросами. - PullRequest
0 голосов
/ 07 октября 2011

Я пишу этот скрипт, чтобы он отображал состояние скрипта импорта. Он должен вызывать функцию, которая запускает http-запрос каждые X секунд.

function progres_import() {
//if(import_status != 'finalizat') {
    alert("progres_import");
    setTimeout(function() { return update_progres_import(); }, 2000);
    setTimeout(function() { return update_progres_import(); }, 4000);
    setTimeout(function() { return update_progres_import(); }, 6000);
    setTimeout(function() { return update_progres_import(); }, 8000);

    //setTimeout(function() { progres_import(); }, 400);
//}
//else {

//}
}

это то, что я использовал для проверки работоспособности. Я тоже добавил комментарии, чтобы показать, что я собираюсь с ними сделать. Я перепробовал все возможные вызовы setTimeout, с кавычками, без кавычек, с анонимной функцией и без нее.

var xmlhttp_import_progres;
function update_progres_import() {
xmlhttp_import_progres=GetXMLHttpObject();
if (xmlhttp_import_progres==null) {
    alert ("Browser does not support HTTP Request (xmlhttp_import_progres)");
    return;
}

var url="crm/ferestre/import_progres.php";  
url=url+"?sid="+Math.random();

xmlhttp_import_progres.onreadystatechange=function() {
    if (xmlhttp_import_progres.readyState == 4) {
        progres_resp = xmlhttp_import_progres.responseText;
        progres = progres_resp.split('_');
        import_nrc = progres[0];
        import_nrt = progres[1];
        import_status = progres[2];
        mesaj = 'Progres import: ' + import_nrc + ' / ' + import_nrt;
        //document.getElementById("corp_import_mesaj").innerHTML = mesaj;
        alert(progres_resp);        
    }
};
xmlhttp_import_progres.open("POST",url,true);
xmlhttp_import_progres.send(null);
}

это бизнес-конец функции progres_import.

что происходит, если я получаю предупреждение ("progress_import") в первой функции прямо при запуске процесса импорта, но предупреждение (progres_resp) во второй начинает появляться только после завершения процесса импорта (он все еще поддерживает 2-секундный интервал, так что в этом смысле setTimeouts работал).

скрипт php в запросе ajax просто берет некоторые переменные сеанса, которые устанавливает скрипт импорта, и печатает их для использования в JavaScript (x импорт из y всего, z не удалось, и так далее)

Есть идеи, почему он так себя ведет?

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

xmlhttp_import_progres.readyState == 4) - это только true в конце запроса. Следовательно, ваши диалоговые окна с предупреждениями появляются после завершения запроса.

Кроме того, вы не можете ожидать, что ваша функция будет отображать оповещения через 2 секунды, потому что сервер может или не может отвечать так быстро.

Последнее замечание: если вы хотите использовать функцию периодического обновления, используйте setInterval(function(){...}, 2000).

EDIT

Также добавьте var таким образом: var xmlhttp_import_progres = GetXMLHttpObject();. В настоящее время вы глобально определяете объект HTTP, в результате чего доступен только один экземпляр объекта HTTP.

1 голос
/ 07 октября 2011

Здесь, вы можете попробовать немного отредактировать:
Пожалуйста, рассмотрите ответ выше, но этот код прояснит для вас:


function progres_import() {
//if(import_status != 'finalizat') {
    alert("progres_import");
    setTimeout(function() { return update_progres_import(0); }, 2000);
    setTimeout(function() { return update_progres_import(1); }, 4000);
    setTimeout(function() { return update_progres_import(2); }, 6000);
    setTimeout(function() { return update_progres_import(3); }, 8000);

    //setTimeout(function() { progres_import(); }, 400);
//}
//else {

//}
}

И

var xmlhttp_import_progres = [];
function update_progres_import(i) {
    xmlhttp_import_progres[i]= GetXMLHttpObject();
    if (xmlhttp_import_progres[i]==null) {
        alert ("Browser does not support HTTP Request (xmlhttp_import_progres)");
        return;
    }

    var url="crm/ferestre/import_progres.php";  
    url=url+"?sid="+Math.random();

    xmlhttp_import_progres[i].onreadystatechange=function() {
        if (xmlhttp_import_progres[i].readyState == 4) {
            progres_resp = xmlhttp_import_progres[i].responseText;
            progres = progres_resp.split('_');
            import_nrc = progres[0];
            import_nrt = progres[1];
            import_status = progres[2];
            mesaj = 'Progres import: ' + import_nrc + ' / ' + import_nrt;
            //document.getElementById("corp_import_mesaj").innerHTML = mesaj;
            alert(progres_resp);        
        }
    };
    xmlhttp_import_progres[i].open("POST",url,true);
    xmlhttp_import_progres[i].send(null);
}
...