这是我的第一个问题,请保持温柔:)我已经尝试解决了几个小时,但进展很快。
背景
我有一个Web应用程序,其中使用.ajax()启动了一个进程。这可能需要一些时间才能完成,因此我建立了一个jQuery.progressbar()系统来提供UI反馈,该反馈与.ajax()同时启动(使用setInterval),并且每250ms调用一次。 getJSON()读取后台事件的进度。服务器端的所有功能似乎都可以完美运行。
问题
似乎(由于对console.log()的大量使用,.ajax()事件阻止了.getJSON()的运行,直到.ajax()完成。在我的控制台日志中,我每隔250ms就有一次指示updateProgressBar ()正在运行,但是直到原始.ajax()调用完成后,我才可以进入它的.done部分。
我在这里想念什么?
// file copy dialog
$(function () {
$("#file_copy_dialog").dialog({
autoOpen: false,
resizable: false,
height: 250,
width: 400,
modal: true,
buttons: {
"Copy Files": function () {
// do ajax copy request
console.log("Starting setInterval updateProgressBar()");
window.interval = setInterval('updateProgressBar()', 250);
console.log("---------------------------------- Firing file_copy AJAX request ---------------------------------");
$.ajax({
type: "POST",
url: "/ajax/file_copy.php",
data: {
job_id: "<?php echo $item_data['job_id']; ?>",
item_id: "<?php echo $item_id; ?>",
quote_id: "<?php echo $item_data['quote_id']; ?>"
}
})
.done(function () {
console.log("----------------------------- file_copy AJAX done --------------------------------------");
});
},
"Cancel": function () {
$(this).dialog("close");
}
}
});
});
// paste button click event handler
$(function () {
$("#paste_files").click(function () {
// open dialog box
$("#progressbar").progressbar({
value: 0
});
$(".progress-label").text("Ready");
$("#file_copy_dialog").dialog("open");
});
});
// progress bar initiator
$(function () {
var progressbar = $("#progressbar"),
progressLabel = $(".progress-label");
progressbar.progressbar({
value: false,
change: function () {
progressLabel.text(progressbar.progressbar("value") + "%");
},
complete: function () {
progressLabel.text("Complete!");
}
});
});
// file copy progress checker
function updateProgressBar() {
console.log("Running updateProgressBar()");
$.getJSON("/ajax/file_copy_progress.php")
.done(function (json) {
console.log("In UpdateProgressBar().done");
// successful check
if (json.status == 'ERROR') {
console.log("updateProgressBar() json.status = ERROR");
$('#progresstext').text(json.message);
clearInterval(window.interval);
} else {
console.log("updateProgressBar() json.status = " + json.status + " json.value = " + json.value);
$('#progressbar').progressbar({
value: json.value
});
$('#progresstext').text(json.message);
}
if (json.value == 100) {
console.log("ClearInterval()");
clearInterval(window.interval);
}
})
.fail(function (jqxhr, textStatus, error) {
// check failed
$('#progresstext').text("Progress check request failed");
});
}
请原谅我的格式...,感谢您可能提供的任何帮助。
编辑
多亏了Adeneo,以上代码完全没有问题。问题在于PHP锁定了会话文件。在最初的后端ajax()脚本中的战略位置调用session_write_close()和session_start(),将允许第二个脚本偶尔进行查找并读取状态。
参考方案
问题出在PHP,而不是jQuery。
正如@adeneo指出的那样,一次只有一个进程可以读取/写入会话文件。 (考虑时很合逻辑!)。呼唤
session_write_close()
然后
session_start()
在初始脚本中具有战略意义的地方,将允许第一个脚本偶尔读取会话变量,并使整个过程按预期工作。
jQuery ajax发布电子邮件字段 - javascript我不确定为什么我无法发布电子邮件字段的内容,这是我的代码。<html> <head> <title></title> <script src="//code.jquery.com/jquery-1.11.2.min.js"></script> </head>…
jQuery Ajax上传文件php即使没有内容也接收数组 - javascript它正在工作,但是在每次提交时,我什至都收到一个数组,甚至没有将文件添加到文件输入(多文件输入) postData = new FormData(this); $.ajax({ url: "/url", type: "POST", data: postData, cache: false, contentType: fa…
用户刷新页面或导航到其他页面时,侧边栏上的其他广告 - javascript我有一个带有广告部分的侧边栏。当用户导航到其他页面或刷新页面时,我想在该部分上显示其他广告。我想轮播5-10个广告。每个广告都是一个脚本,因此包含10个以上的广告会减慢我的页面速度。在刷新时或用户导航到其他页面时轮播广告的最佳方法是什么?这是给我的wordpress博客的,但我不想使用插件。JS Fiddle<?php $ads = array(…
jQuery val函数在隐藏字段上不起作用? - javascript这是我的HTML代码:<div style='display:none;' id='allformid'> <div> <form action='#'> <input type='text' name='name' …
提取元素的HTML - javascript我正在尝试获取HTML标签的内部HTML,到目前为止,我该怎么做?<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script type="text/javascrip…