在后台运行:在Javascript中进行线程化?

时间:2012-06-07 21:38:25

标签: javascript multithreading

我有一系列用户按顺序看到的表单。当用户提交表单时,它会提交一个PHP文件,该文件将根据提交的值执行一些繁重的工作,这可能需要10秒或更长时间才能运行,我不希望我的用户必须等待才能访问下一个表格。

由于我不需要等待PHP完成(我不需要其结果才能继续),是否可以将用户重定向到提交的下一页,并提交表单背景,所以它不会减慢用户的速度?

我听说Javascript setTimeout()可以模仿线程。这是一个让它并行运行的选项吗?

我的JS函数goNext()将用户重定向到下一页(但不提交)。那会是这样的工作吗?

$('#submitButton').click(function() {
    setTimeout(submitForm(), 1);
    goNext();
});

function submitForm() {
    $('#form').submit();
}

3 个答案:

答案 0 :(得分:0)

每个HTTP请求都会收到响应。因此,为了告诉您的请求有效,您需要从服务器获得良好的响应(200)。

为了做你的建议,我认为你应该在服务器端处理这个问题。

答案 1 :(得分:0)

使用ajax异步处理表单。我知道像jQuery这样的库允许你有一个回调,当返回数据时会调用它。您也可以在没有库的情况下执行此操作,但只需简化库即可。

从他们的网站:

$.ajax({
  url: 'ajax/test.html',
  success: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});

(默认情况下,呼叫是异步的)

没有库,你可以这样做:

var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    alert('Ajax returned';
    }
  }
xmlhttp.open("GET", "some_url.txt",true);
xmlhttp.send();

xmlhttp.onreadystatechange=是您设置“回调”功能的地方,但是使用普通的javascript,您可能想要检查就绪状态是否实际上是成功就绪状态(如示例所示)。

答案 2 :(得分:0)

不,这不起作用。当用户离开页面时(例如,通过提交表单),javascript被终止,并且下一页面加载创建新的javascript上下文。您不能仅使用javascript将变量或计时器保留在请求上。

如果一切都发生在同一页面上,你可以使用ajax,使用ajax调用发送表单数据并等待处理完成,但是如果用户意外关闭页面或在ajax调用等待时导航,处理中止。

更好的解决方案是将服务器上的上传,处理和报告部分分开;这可能是这样的架构:

  • 在服务器上设置任务队列。传统的选择是数据库表;进程为每个需要处理的上载添加记录,并更改它以指示状态(新的,工作的,已完成的)。
  • 上传处理程序只读取上传的文件并将其添加到任务队列中。完成后,用户可以安全地离开。
  • 运行一个cron作业或工作进程,定期查看是否有新的任务要处理;如果是这样,它会选择一个(将其状态设置为“工作”),处理它,并在完成后更新它。
  • 同时,您的Web应用程序会记住作业的ID,并轮询服务器的状态。一旦变为“完成”,它就会通知用户(如果您需要反馈)。 Ajax为此提供了最流畅的方式,否则用户必须不时刷新以查看其上传的状态。