等待已完成的PHP处理的最佳方法

时间:2014-12-06 23:00:54

标签: javascript php jquery ajax

我对网络编程很陌生,所以请耐心等待。

我创建了一个将表单数据提交给PHP exec()函数的网页。此功能从网站请求数据(一次或多次),以各种方式操作它,并将其粘贴在我的Web服务器上的文件中。处理时,网页上会出现一个加载器.gif文件。我创建了一段JavaScript代码来处理进程等待期,但我不确定我做得对。脚本如下:

<script>

window.set = 0;
window.uid = '';

document.forms[0].onsubmit = function(e) 
{
    console.log($(this).serialize());
    e.preventDefault();
    e.stopPropagation();

    // Display "Waiting" .gif during processing
    $('#loader').show();

    // Perform data submission once (when window.set = 0). After that, 
    // keep waiting for output and manifest file to be created. Call
    // "fetch" function repeatedly to test for completion. When completed, 
    // call clearInterval to stop processing.

    window.int_ = setInterval(function() 
    {
        $.ajax({
            "url": "./", 
            "type": "POST", 
            "data": !window.set ?$("#form").serialize() : { 'fetch': 1, 'uid': window.uid }}).done(function(data) 
            {   
                var d = data = JSON.parse(data);

                if (!window.set) 
                {
                    window.uid = d.uid;
                    window.set = 1;
                    return;
                }

                if (data.status === 'ok') 
                {
                    document.location.replace(data.href);
                    data.manifest = data.manifest.replace(/\./g, ".<br />");
                    $('#manifest').show();
                    $('#manifest').html("<b>Results from run:</b> <br />" + data.manifest);
                    $('#loader').hide();
                    window.set = 0;
                    window.uid = '';

                    clearInterval(window.int_);
                } 
                else
                {
                    // waiting
                }
            });
    }, 100);
}
</script>

第一个AJAX调用中引用的“fetch”函数的代码如下:

if ($_POST['fetch']) 
{
    $uid = $_POST['uid'];

    /* check for availability*/

    if (is_file(realpath("./$uid")))
    {
        $f = file_get_contents($uid);
        $m = file_get_contents("./$uid.manifest");
    } 
    else 
    {
        $f = "";
    }

    if ($f != "") 
    {
        echo json_encode(array("status" => "ok", "href" => $f, "manifest" => $m));
        die();
    }  
    else 
    {

        echo json_encode(array("status" => "err", "href" => $f));
        die();
    }
}

我在这里要做的是执行外部网站处理/操作一次,同时等待处理完成。 “fetch”函数检查我的输出文件是否已创建。如果有,则处理结束。

这是解决此问题的程序化方法吗?有没有更好的替代方案?

我非常感谢您提供的任何见解。我真的想学习正确的做事方式。

1 个答案:

答案 0 :(得分:0)

我尝试简单解释HTTP请求......

首先,您在Web服务器上有后端代码,在您的情况下用PHP编写。此脚本不执行任何其他操作,然后处理您发送给它的数据,并可能发布(回显)失败,或者将其处理成功返回到前端客户端。在你的情况下,这就是全部。

在前端方面,无论使用何种语言或设备,它的程序几乎相同。

您在异步任务中调用HTTP POST或GET请求,在您的情况下,jQuery通过向您的php调用其$ .ajax函数来为您执行此操作。

同样在该请求中,您定义了一个回调函数,该函数将在异步处理完成后自动调用。 jQuery也为你做了这个,它是在$ .ajax之后的.done()函数。

要指示加载,最好的方法是在$ .ajax代码行之前显示加载图像...并在.done()函数内隐藏或删除它...表示加载已完成。 ..

多数人。