为什么我的Ajax调用不是异步

时间:2016-10-18 11:56:28

标签: php jquery ajax asynchronous

我使用JQuery和AJAX在PHP文件中调用慢速函数,但在PHP函数完成之前我不会得到响应。尽管进行了2天的搜索,我还是无法弄清楚原因。我把它缩小为两个测试文件,它们表现出完全相同的行为。因此,我的php函数位于名为" ajaxfuncs.php"的文件中:

<?php
Class AjaxFuncs{

    public function __construct() {
        $this->testbuffer ();
    }


    function testbuffer(){
        echo 'Starting Test Buffer Output. There should be a 2 second delay after this text displays.'  . PHP_EOL;
        echo " <br><br>";
        echo '<div id="testdata" class="testdata">0</div>';

        // The above should be returned immediately
        flush();

        // Delay before returning anything else
        sleep(2);

            for ($a = 0; $a < 3; $a++) {
                echo '<script type="text/javascript">document.getElementById("testdata").innerHTML="' . (int)($a + 1) . '"</script>';
                flush();
                // Delay for 1 second before updating the value
                sleep(1);
            }
    }
}

$AjaxFuncs = new AjaxFuncs();
?>

如果我打开&#34; ajaxfuncs.php&#34;文件在浏览器中。它完全符合我的期望,输出每秒更新一次,直到完成。所以我知道我已经在服务器上进行了缓冲。

但是当我使用以下$ .ajax调用它时,它是不对的。我把除了php之外的所有东西都放到ajax函数中,放到另一个名为&#34; testindex.php&#34;的php文件中。为了方便。就是这样:

<?php
    header( 'Content-type: text/html; charset=utf-8' );
    header("Cache-Control: no-store, must-revalidate");
    header ("Pragma: no-cache");
    header("Expires: Mon, 24 Sep 2012 04:00:00 GMT");

?>

<body>
    <a>Test Page. Wait for it...</a>
    <div id="maincontent">
    </div>
</body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script type="text/javascript"
        src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>

<script>

    $(document).ready(function(){
            console.log ('Document Ready');

        function callajax(){

            var ajaxfilepath = "ajaxfuncs.php";
            return $.ajax({ 
                            url: ajaxfilepath,
                            data: {action: 'testbuffer'},
                            type: 'get',
                            cache: false,
                            dataType: "text", 
                            beforeSend: console.log('Starting Ajax Operation')
                        })
                        .done(function(result){
                            processajaxcalloutput(result);
                        })
                        .always(function(){
                            console.log(' Ajax Internal Complete Detected');
                        })
                        .fail(function( jqXHR, textStatus ) {
                            console.log( "Ajax Request failed: " + textStatus );
                        });

        }

        function processajaxcalloutput(result){
            var message = 'Processing Ajax Response' ;
            console.log(message);

            $("#maincontent").append(result);

        }

        callajax();

    });

一切正常,没有错误。控制台很清楚 - 没有错误(我正在使用Chrome和Firefox进行测试)。但是在完成整个PHP功能之前,我似乎无法获得响应。我已经尝试了所有我能找到的东西,特别是数百种不同的东西来强迫缓存,但无济于事。任何帮助深表感谢。感谢。

更新 因此,基于到目前为止的反馈,很明显调用是异步的并且代码很好,但异步并不意味着我会在执行时从php函数获得连续的输出数据流。相反,整个响应将在执行结束时返回。我不会将此问题转移到有关流式传输的问题,而是将其留在此处,直到我解决流式传输问题。

0 个答案:

没有答案