在ajax请求中重定向

时间:2012-08-18 11:41:58

标签: javascript jquery codeigniter asynchronous

我有一个用户可以发布链接的网站。用户填写包含2个字段的表单:

  • 标题
  • URL

当用户点击“提交”时,我有一个抓取工具,可以查找所提供链接的图像并制作缩略图。

问题是爬虫通常需要大约5-10秒才能完成加载并裁剪拇指。

我以为我可以像这样做一个ajax调用。正如您所看到的,当用户首先提交链接时,我们会看到它是否有效(第一次ajax调用),如果成功,我们会进行另一次ajax调用以尝试查找并保存此链接的图像。

我的想法是在将用户移动到links.php页面时执行此操作,但是,我发现如果我这样做,则AJAX调用会中断并且save_image.php中的函数不会运行。

我可以做些什么来避免让我的用户等待save_image.php进程?我需要运行此过程,但我不需要返回任何数据。

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

提前致谢!

提升:我希望用户提交一个链接并将用户重定向到链接页,同时生成该链接的缩略图。我不想向用户显示缩略图。

4 个答案:

答案 0 :(得分:3)

AJAX请求似乎失败了,因为当您离开时,用户请求将被中止。因此,save_image.php的执行被中断。

您可以使用PHP的ignore_user_abort强制PHP进程在后台继续。把它放在save_image.php的顶部:

<?php
    ignore_user_abort(true);

    // ... save image, etc.
?>

为此,您必须向客户端发送(和flush)一些输出:

  

在尝试向客户端发送信息之前,PHP不会检测到用户已中止连接。仅使用echo语句并不能保证信息的发送,请参阅flush()

任何输出都应该有效(例如“OK”)。考虑到您正在使用框架,这可能是一个挑战,但这不应该是不可能的。这可能有效:Flushing with CodeIgniter

您可以阅读有关PHP连接处理here的更多信息。

答案 1 :(得分:1)

强制用户首先填写网址然后填写标题,当用户转到标题字段开始抓取数据时,直到完成标题并按下sumbit您将获得一些时间并使进程显然更快。

答案 2 :(得分:0)

如果您不需要返回数据,为什么要使用XHR?只需让您的表单提交links.php的链接,然后将图片保存在那里!

答案 3 :(得分:0)

要了解您的问题,我们需要了解javascript的工作

您的代码如下

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

从上面我可以说,只要发出ajax请求,java脚本就会执行第二行而不管响应如何。

我们可以采用以下示例

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) 
                    {
                         console.log(data);
                    }
});

for(var i = 0; i < 15000000; i++)
{
      console.log(i);
}

您可能会看到如下输出

1
2
3
.
.
.
1000
data//response of ajax
.
.
14999999

这样可以避免使用jQuery.when()我们的ajax成功函数。

希望这会对你有所帮助