Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery中的并行异步请求_Javascript_Jquery_Performance - Fatal编程技术网

Javascript jQuery中的并行异步请求

Javascript jQuery中的并行异步请求,javascript,jquery,performance,Javascript,Jquery,Performance,我正在开发一个应用程序,其中一个用户填写了一份冗长的表单。离开每个字段后,将调用客户端的“save”函数,该函数最终执行$.ajax()调用。进行此操作时,字段旁边会显示一个“微调器”图标,让用户知道正在进行保存 我的问题是,在较旧的浏览器(IE7+8)中,这些操作可能需要几秒钟的时间(保存后会发生很多客户端的事情——它们是复杂的表单,保存的响应可能会或不会根据它们提供的答案呈现新的表单字段)。在保存过程中,UI似乎有点锁定,在保存完成之前,用户无法与其他表单元素交互 我希望能够做的是运行“sa

我正在开发一个应用程序,其中一个用户填写了一份冗长的表单。离开每个字段后,将调用客户端的“save”函数,该函数最终执行$.ajax()调用。进行此操作时,字段旁边会显示一个“微调器”图标,让用户知道正在进行保存

我的问题是,在较旧的浏览器(IE7+8)中,这些操作可能需要几秒钟的时间(保存后会发生很多客户端的事情——它们是复杂的表单,保存的响应可能会或不会根据它们提供的答案呈现新的表单字段)。在保存过程中,UI似乎有点锁定,在保存完成之前,用户无法与其他表单元素交互

我希望能够做的是运行“save”调用,并允许用户在发生时继续与站点交互。有没有办法让这种情况发生?以下是我们正在使用的当前代码:

function saveField(reviewData, isIdField) {
    $.ajax({
        type: "POST",
        url: serviceUrl,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        processdata: true,
        success: serviceSuccess,
        error: serviceFailed
    });
}
serviceSuccess
函数是非常jQuery密集型的函数,并执行大量的UI操作


编辑:服务成功功能太复杂,无法保证在SO上发布。根据评论+发布的答案,看起来我无法让它真正异步运行,但@surui的建议可能会带来一些成果。另外,我将研究如何清理这段代码,我本来打算这么做的。感谢您的回复。

如果我理解正确,您的问题不是ajax操作,而是同步执行的
serviceSucess
函数。因此,如果我们看到这个函数的实现,我想可以提供一个更好的答案。通常,javascript中不应该有长同步函数。不过,我可以提出一些建议(附带警告)

假设您可以将代码划分为4

a(response);
b(response);
c(response);
d(response);
每个都需要100毫秒,加起来就是400毫秒

如果它们可以并行运行(也就是说,顺序不重要,在javascript中不能并行运行),我们可以编写如下代码:

setTimeout(function(){
  a(response);
}, 0);

setTimeout(function(){
  b(response);
}, 0);

setTimeout(function(){
  c(response);
}, 0);

setTimeout(function(){
  d(response);
}, 0);
(或者你可以使用)

如果它们串联运行,您可以使用(类似于async.parallel)或普通java脚本(只需嵌套setTimeout-s)来:


同样,如果我们能够以某种方式最小化dom操作,那么我所写的可能是一种过度的杀伤力。

如果我理解正确,您的问题不在于ajax操作,而在于同步执行的
serviceSucess
函数。因此,如果我们看到这个函数的实现,我想可以提供一个更好的答案。通常,javascript中不应该有长同步函数。不过,我可以提出一些建议(附带警告)

假设您可以将代码划分为4

a(response);
b(response);
c(response);
d(response);
每个都需要100毫秒,加起来就是400毫秒

如果它们可以并行运行(也就是说,顺序不重要,在javascript中不能并行运行),我们可以编写如下代码:

setTimeout(function(){
  a(response);
}, 0);

setTimeout(function(){
  b(response);
}, 0);

setTimeout(function(){
  c(response);
}, 0);

setTimeout(function(){
  d(response);
}, 0);
(或者你可以使用)

如果它们串联运行,您可以使用(类似于async.parallel)或普通java脚本(只需嵌套setTimeout-s)来:


同样,如果我们能够以某种方式最小化dom操作,那么我所写的可能是一个过度的杀伤力。

如果您对dom进行大量操作,它将锁定浏览器。如何修复它?限制您写入DOM的次数。不幸的是,JS是一种单线程脚本语言,因此,如果您在循环期间触碰,它将冻结浏览器。如果看不到
serviceSuccess
的本质,就很难给出任何解决方案的建议。我下意识的回答包括1)在发送响应之前让您的web服务器做更多的工作/验证,以及2)在必要时只触摸DOM的功能。可能会引起兴趣:如果您对DOM进行大量操作,它将锁定浏览器。如何修复它?限制您写入DOM的次数。不幸的是,JS是一种单线程脚本语言,因此,如果您在循环期间触碰,它将冻结浏览器。如果看不到
serviceSuccess
的本质,就很难给出任何解决方案的建议。我的下意识回答包括1)在发送响应之前让您的web服务器做更多的工作/验证,以及2)只在必要时触摸DOM的功能。可能有兴趣: