如何向PHP发送一个简短的Ajax请求,获得确认,而不必等待完整的处理完成


How to send a short Ajax request to PHP, get confirmation and don't wait for full processing to finish

这里的第一篇文章我有一个移动应用程序(Phonegap),它发送一个ajax请求到PHP服务器,说一个朋友邀请。当收到请求时,必须做一些事情(创建链接,授权,发送电子邮件等),这需要很长时间(5秒)。在此期间,应用程序上的用户正在查看旋转器,等待ajax请求完成。

理想:

  • 返回确认"好友请求已收到",而不等待进程完成。
  • 没有Cron作业,因为等待1分钟太长。
  • 一些简单的(Gearman是可怕的)

app中:

$.ajax({
    url: 'http://www.my_site.com/action.php',
    type: 'POST',
    data: "my_guid="+my_guid+"&friend_guid="+friend_guid, 
    dataType: 'json',
    success: function(json) {
        // Send confirmation
    },
    error: function(json) {
        // Show error
    }
}

在服务器端(PHP):

$my_guid = $_POST['my_guid'];
$friend_guid = $_POST['friend_guid'];
// return here confirmation to the app
veryLongFunction($my_guid,$friend_guid); //continue executing long function

很简单,不显示旋转器。

无论如何都是异步的

不要显示旋转器。请求本身是异步的。当请求在后台等待响应时,用户可以继续使用页面。只有在接收到响应时,成功处理程序才会启动。

<

选择反馈/strong>

因此,我将在页面顶部显示一个小通知,而不是显示一个旋转器覆盖,上面写着"保存...."’,这些东西不会太挡住视线,甚至可能只是在角落里的一个小图标或动画,或者在他们点击按钮的顶部(见下面的代码片段)。

然后,当收到响应时,显示一个更明显的通知,指示成功或错误。

处理导航

离开页面将结束请求。这并不意味着PHP脚本立即结束,但是如果您开始输出信息并将其发送给客户端,服务器将注意到连接已断开,并将终止PHP脚本。您可以通过使用ignore_user_abort(true)来防止这种情况,并使PHP完成请求。

小细节:当朋友邀请被保存时,你不能真正看到它,所以如果你导航到另一个页面,也显示朋友邀请按钮,这是很棘手的,使其显示正确的状态。一种解决方案可能是在你开始保存邀请时设置一个"保存"标志,但我个人不会这么做。只要确保你的脚本优雅地处理重复保存,并对用户隐藏碰撞。

内联指示器原型

下面是一个小代码片段,说明我所说的内联显示是什么意思。它不执行实际的请求,而是使用setTimeout进行模拟。您可以单击每个按钮,然后继续使用该页面。我没有显示一个大的旋转器,而是在你刚刚点击的按钮中显示一个文本,这样你就知道你正在保存哪个朋友请求。

这样,就有更多的反馈给用户(保存的确切名称),反馈不那么引人注目(它只存在于不应该再点击的按钮位置),并且您可以在同一位置显示响应,或者选择显示通知(或两者)。

$('button').on('click', function(){
  
  // Button is clicked. Disable and show an indicator.
  var button = $(this);
  button.prop('disabled', true);
  button.text('saving...');
  
  // Simulate the request that takes 5 seconds.
  setTimeout(
    function(){
      // Simulate success
      button.text('Saved!');
      button.css('color', 'green');
    }, 5000);
  
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>John <button>Send friend request</button>
<li>Jane <button>Send friend request</button>
<li>Jack <button>Send friend request</button>
<li>Janet <button>Send friend request</button>