Javascript处理与ASP.NET MVC
我有以下javascript和JsonResult。我遇到的问题是ajax帖子没有足够的时间让JsonResult返回适当的数据。我可能不完全理解javascript处理,我确信这是出于设计,但我想知道如何使这成为一个同步请求。简而言之,在javascript继续处理之前,等待JsonResult操作完成Javascript处理与ASP.NET MVC,javascript,asp.net-mvc,asp.net-mvc-3,Javascript,Asp.net Mvc,Asp.net Mvc 3,我有以下javascript和JsonResult。我遇到的问题是ajax帖子没有足够的时间让JsonResult返回适当的数据。我可能不完全理解javascript处理,我确信这是出于设计,但我想知道如何使这成为一个同步请求。简而言之,在javascript继续处理之前,等待JsonResult操作完成 <script type="text/javascript"> $(document).ready(function () { var table = document.
<script type="text/javascript">
$(document).ready(function () {
var table = document.getElementById("updateTable");
var tasks = new Array("shutdown", "prep", "boot", "ready");
var tasksLength = tasks.length;
for (var i in tasks) {
for (var loop = 1, max = table.rows.length; loop < max; loop++) {
id = table.rows[loop].cells[0].innerHTML;
task = tasks[i];
ImageUpdateStatus = {
ImageId: parseInt(id),
Task: task,
Status: "pending"
}
$.ajax({
type: "POST",
url: "UpdateStatus",
data: $.postify(ImageUpdateStatus),
success: function (data) {
var status = data.status;
}
});
ImageUpdateStatus.Status = status;
if (ImageUpdateStatus.Status == "success") {
task = task.concat(" ");
document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";
j = parseInt(i) + 1;
if (j < tasksLength) {
nextTask = tasks[j];
nextTask = nextTask.concat(" ");
document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
}
}
}
}
document.getElementById('nextButton').className = "navigation";
document.getElementById('nextButton').disabled = false;
});
但是您确实应该避免这种情况,您应该真正考虑让应用程序在等待ajax请求的情况下工作
但是您确实应该避免这种情况,您应该真正考虑让您的应用程序在等待ajax请求的情况下工作您不想让请求同步;您希望将所有依赖于结果的代码放入回调:
$.ajax({
type: "POST",
url: "UpdateStatus",
data: $.postify(ImageUpdateStatus),
success: function (data) {
var status = data.status;
ImageUpdateStatus.Status = status;
if (ImageUpdateStatus.Status == "success") {
task = task.concat(" ");
document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";
j = parseInt(i) + 1;
if (j < tasksLength) {
nextTask = tasks[j];
nextTask = nextTask.concat(" ");
document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
}
}
}
});
您不希望使请求同步;您希望将所有依赖于结果的代码放入回调:
$.ajax({
type: "POST",
url: "UpdateStatus",
data: $.postify(ImageUpdateStatus),
success: function (data) {
var status = data.status;
ImageUpdateStatus.Status = status;
if (ImageUpdateStatus.Status == "success") {
task = task.concat(" ");
document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";
j = parseInt(i) + 1;
if (j < tasksLength) {
nextTask = tasks[j];
nextTask = nextTask.concat(" ");
document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
}
}
}
});
只需将依赖于ajax请求结果的代码移到success回调函数中:
$.ajax({
type: "POST",
url: "UpdateStatus",
data: $.postify(ImageUpdateStatus),
success: function (data) {
ImageUpdateStatus.Status = data.status;
if (ImageUpdateStatus.Status == "success") {
task = task.concat(" ");
document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";
j = parseInt(i) + 1;
if (j < tasksLength) {
nextTask = tasks[j];
nextTask = nextTask.concat(" ");
document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
}
}
}
});
只需将依赖于ajax请求结果的代码移到success回调函数中:
$.ajax({
type: "POST",
url: "UpdateStatus",
data: $.postify(ImageUpdateStatus),
success: function (data) {
ImageUpdateStatus.Status = data.status;
if (ImageUpdateStatus.Status == "success") {
task = task.concat(" ");
document.getElementById(task.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Success.png";
j = parseInt(i) + 1;
if (j < tasksLength) {
nextTask = tasks[j];
nextTask = nextTask.concat(" ");
document.getElementById(nextTask.concat(id)).src = "/PVSUtil_ver2/Assets/Images/Image.Load.gif";
}
}
}
});
我真的觉得您应该聚合第一次在服务器端呈现视图所需的任何数据,然后将其向下推到页面。一旦页面中的数据以JSON格式存储在一个隐藏字段中,您就可以使用JavaScript进行渲染,但我认为在第一次渲染页面时,让页面进行Ajax调用不是最佳选择。我真的觉得您应该聚合第一次在服务器上渲染视图所需的任何数据侧边,然后将其向下推至页面。一旦页面中的数据以JSON格式存储在一个隐藏字段中,您就可以使用JavaScript进行渲染,但我认为在第一次渲染页面时,让页面进行Ajax调用不是最佳选择。。我也需要设置async:false吗?我现在已经设置好了,它似乎正在工作。@bcahill否,您不需要async:false,因为这将在请求返回之前锁定浏览器。设置async:false是使它工作的唯一方法。没有那一套,它继续循环。不过现在效果很好。谢谢,太棒了,谢谢。我也需要设置async:false吗?我现在已经设置好了,它似乎正在工作。@bcahill否,您不需要async:false,因为这将在请求返回之前锁定浏览器。设置async:false是使它工作的唯一方法。没有那一套,它继续循环。不过现在效果很好。谢谢。我不知道我还能做些什么让它等待。Ajax调用一个关闭服务器的函数,然后我ping服务器以确保它已关闭,并返回成功或失败。它忽略异步:false,除非我按照上面解释的那样做。不确定我还能做什么让它等待。Ajax调用一个关闭服务器的函数,然后我ping服务器以确保它已关闭,并返回成功或失败。它忽略异步:false,除非我按照上面解释的那样做。此设置的原因是我有一个服务器表。Javascript获取行中的每个项并将其值传递给后端控制器。控制器负责关闭,将关闭状态发送回页面,然后准备服务器进行更新,将准备状态发送回页面,最后引导服务器,并将引导过程的状态发送回页面。此设置的原因是我有一个服务器表。Javascript获取行中的每个项并将其值传递给后端控制器。控制器负责关闭,将关闭状态发送回页面,然后准备服务器进行更新,将准备状态发送回页面,最后引导服务器,并将引导过程的状态发送回页面。