php - 如何向 PHP 发送简短的 Ajax 请求、获得确认并且无需等待完整处理完成

标签 php ajax fork

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

理想情况:

  • 返回确认信息“已收到好友请求”,无需等待流程完成。
  • 没有 Cron 作业,因为等待 1 分钟太长。
  • 简单的事情(Gearman 很可怕)

在应用程序上:

$.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

最佳答案

很简单,不显示微调器。

无论如何它都是异步的

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

替代反馈

因此,我不会显示旋转叠加层,而是在页面顶部显示一个小通知,上面写着“正在保存...”,不会过多遮挡视线,甚至可能只是一个小图标或动画在角落里,或者在他们单击的按钮顶部(参见下面的代码片段)来执行操作。

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

处理导航

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

小细节:保存好友邀请时,您无法真正看到它,因此如果您导航到也显示好友邀请按钮的另一个页面,则很难使其显示正确的状态。一种解决方案可能是在开始保存邀请后立即设置“保存”标志,但就我个人而言,我不会走那么远。只需确保您的脚本能够妥善处理重复保存并向用户隐藏冲突即可。

内联指示器原型(prototype)

这里有一个小片段来展示我通过内联显示它的意思。它不执行实际请求,而是使用 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>

关于php - 如何向 PHP 发送简短的 Ajax 请求、获得确认并且无需等待完整处理完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701568/

相关文章:

linux-kernel - gnu/Linux 上 pthread 和 fork 的区别

javascript - 将 php 和 python 中的 RegEx 语法转换为 JS

php - 我有三个 div,如何在不重新加载整个页面的情况下刷新第二个 div?

ajax - 是否将 URL 的 anchor 部分发送到 Web 服务器?

ruby-on-rails - Rails/Ajax/错误处理

c++ - 如何使用 gmock 框架在 C++ 单元测试中模拟 fork 和 execlp 系统调用?

c - 从子进程中的共享内存读取指向共享内存的指针时出现段错误

php - 覆盖 laravel 4 的身份验证方法以使用自定义哈希函数

php - OOP 设计 - 您在哪里/何时验证属性?

php - 为数据库条目生成计数器代码