0

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

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

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

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

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

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

3 回答 3

0

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

为了执行您的建议,我认为您应该在服务器端处理此问题。

于 2012-06-07T21:42:23.993 回答
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,您可能想要检查就绪状态是否实际上是成功就绪状态(如示例中所示)。

于 2012-06-07T21:44:40.447 回答
0

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

您可以为此使用 ajax,前提是所有事情都发生在同一页面上,使用 ajax 调用发送表单数据并等待处理完成,但如果用户在 ajax 调用等待时意外关闭页面或导航离开,则处理中止。

更好的解决方案是将上传、处理和报告部分分离在服务器上;这可以像这样构建:

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