簡體   English   中英

在上一個.ajax()調用完成之前,.ajax()調用將不會完成?

[英].ajax() call won't complete until previous .ajax() call is complete?

因此,我正在處理CSV處理腳本的進度條。 dnc_scrubber.php通過CSV並檢查數據庫中的電話號碼,並在單獨的文件中返回匹配和不匹配的數據。 lines.php返回要處理的總行數,而progress.php返回已處理的行數。 我使用這兩個數字來創建jQuery的progressbar函數完成的工作的百分比。

我的問題是,直到完成對dnc_scrubber.php的調用, dnc_scrubber.php doProgressBar()中的第一個.ajax()調用dnc_scrubber.php完成。 為了澄清lines.php ,當在Chrome中查看網絡監視器時,對lines.php的請求與對dnc_scrubber.php的請求同時dnc_scrubber.php ,但是直到dnc_scrubber.php完成運行之前dnc_scrubber.php沒有收到響應。 以下是相關代碼:

$('#progressbar').progressbar();            


$.ajax({
url: 'dnc_scrubber.php',
type: 'POST',
async: true,
data: querystring,  
success: function(){
    for (i = 0; i < files.length; i++){
        $('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />');
        $('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />');
    }
}                       
});


function doProgressBar(){                   
$.ajax({
    url: 'lines.php',
    async: true,
    dataType: 'json',
    complete: function (rez) {
        lines = JSON.parse(rez.responseText);
        lines = parseInt(lines.lines);

        console.log('dpg1 - lines: ' + lines);

        $.ajax({
            url: 'progress.php',
            async: true,
            dataType: 'json',
            complete: function (rez1) {
                prog = JSON.parse(rez1.responseText);
                prog = parseInt(prog.progress);

                console.log('dpg2 - lines: ' + lines + ' prog: ' + prog);

                if (lines > prog){
                    var bar = (prog / lines) * 100;                                         
                    var bar = Math.round(bar);                                          
                    $('#progressbar').progressbar('option', 'value', bar);
                    setTimeout(doProgressBar(), 1000);
                    console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar);
                } else if (lines == prog){
                    $('#progressbar').progressbar('option', 'value', 100);
                    console.log('dpg3 - lines == prog');
                }

            }
        });

    }
});
}



setTimeout(doProgressBar(), 100);

這是正常功能嗎? 我要做什么是不可能的? 我很茫然...在此先感謝您的幫助

編輯: lines.php

session_start();
header('Content-type: application/json');
echo json_encode(array('lines' => $_SESSION['lines']));

progress.php

session_start();
header('Content-type: application/json');
echo json_encode(array('progress' => $_SESSION['lines_processed']));

CSV處理器在每行檢查過程結束時將$_SESSION['lines_proccessed']加一

不知道這是否是導致問題的確切原因,但這是需要解決的問題。

更改

setTimeout(doProgressBar(), 100);

setTimeout(doProgressBar, 100);

您正在立即調用doProgressBar,而不是在超時完成后調用。

服務器很可能將每個用戶的並發連接數限制為1。或者,您正在使用會話,並且第一個腳本已將其鎖定。 第二個腳本將被阻止,直到第一個腳本釋放對會話文件的鎖定。 僅使用session_start()如果你需要,並釋放與鎖session_write_close()只要你用它做。

編輯:我不確定這是否可以,但是您可以嘗試。 每次您要更新會話時,請調用session_start() ,更新會話,然后調用session_write_close() 我不確定是否可以在腳本中多次執行該操作,但似乎應該可以。

Ajax將是異步的。

lines.php上可能等待dnc_scrubber.php作為第一個已鎖定的MySQL。

這只是猜測,因為我們沒有您的PHP代碼,但嘗試手動運行兩個PHP腳本,並檢查lines.php是否不等待MySQL完成。

使用PHP代碼讀取.csv文件時,是否鎖定了文件? 因此,如果它必須讀取兩次,則僅在上一個代碼關閉流時才讀取它?

如果您打開2個瀏覽器並同時運行代碼會怎樣? 兩種瀏覽器同時執行結果是否相同? 還是在等待文件?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM