如何向PHP发送一个简短的Ajax请求,并获得确认和don';不要等待全部处理完成

如何向PHP发送一个简短的Ajax请求,并获得确认和don';不要等待全部处理完成,php,ajax,fork,Php,Ajax,Fork,第一篇帖子:) 我有一个移动应用程序(Phonegap),它向PHP服务器发送ajax请求,比如朋友邀请。当收到请求时,必须做一些事情(创建链接、授权、发送电子邮件等),这需要很长时间(5秒)。在此期间,应用程序上的用户正在查看微调器,等待ajax请求完成 理想情况下: 返回确认“收到好友请求”,无需等待流程完成 没有Cron作业,因为等待1分钟太长 简单的事情(Gearman很可怕) 在应用程序上: $.ajax({ url: 'http://www.my_site.com/act

第一篇帖子:) 我有一个移动应用程序(Phonegap),它向PHP服务器发送ajax请求,比如朋友邀请。当收到请求时,必须做一些事情(创建链接、授权、发送电子邮件等),这需要很长时间(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
    }
}
$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):

$.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
    }
}
$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脚本。您可以通过使用来防止这种情况,并使PHP完成请求

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

内联指示器原型

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

因此,通过这种方式,会有更多的反馈给用户(保存的确切名称),反馈不会太突出(它只在按钮的位置,无论如何都不应该再点击),并且您可以在相同的位置显示响应,或者选择显示通知(或两者兼而有之)

$('button')。在('click',function()上{
//单击按钮。禁用并显示指示器。
var按钮=$(此按钮);
按钮.prop('disabled',true);
文本('saving…');
//模拟需要5秒钟的请求。
设置超时(
函数(){
//模拟成功
text('Saved!');
css('color','green');
}, 5000);
});

  • 约翰向朋友提出请求
  • 简发送朋友请求
  • 杰克发送朋友请求
  • Janet发送好友请求
你是想得太多了还是我不明白?不要为ajax事件加载微调器,在触发ajax事件后继续运行函数。好吧,我需要确保数据在那里是安全的。如果有,我想把控制权还给用户。所以在我确认数据没有任何错误之前,不应该允许用户离开页面。哇!我真不敢相信你的回答“GolezTrol”是怎么来的!我会确保我真的消化了它,但这听起来像是一个明智的举动(我太多地试图在PHP方面解决它)。我唯一的问题是,如果用户单击指向另一个页面的链接,这将中断连接和ajax请求,对吗?它将中断请求,因此它不会等待响应,但您可以使用来让PHP完成请求。我在答案中添加了一个小标题。太棒了!我刚做了一个虚拟测试,它就像一个符咒!我还向ajax测试添加了一个speicif错误处理,该测试名为xhr.status!=0以避免在导航离开时收到错误消息。再次感谢!:)(没有足够的声誉来提高投票率……)