[英].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.