복붙노트

[JQUERY] jQuery를 AJAX를 점진적으로 스트리밍 읽어?

JQUERY

jQuery를 AJAX를 점진적으로 스트리밍 읽어?

해결법


  1. 1.이 똑바로 최대의 자바 스크립트를 사용할 것입니다. 그 이유는 당신이 지속적으로 여론 조사를 원하고 화재에 대한 콜백을 기다릴 거라고이다. 당신은 이것에 대한 jQuery를 필요하지 않습니다, 그것은 꽤 간단합니다. 그들은 아약스 패턴 웹 사이트에서이에 대한 몇 가지 좋은 소스 코드가 있습니다.

    이 똑바로 최대의 자바 스크립트를 사용할 것입니다. 그 이유는 당신이 지속적으로 여론 조사를 원하고 화재에 대한 콜백을 기다릴 거라고이다. 당신은 이것에 대한 jQuery를 필요하지 않습니다, 그것은 꽤 간단합니다. 그들은 아약스 패턴 웹 사이트에서이에 대한 몇 가지 좋은 소스 코드가 있습니다.

    기본적으로, 당신은 단지 그 위치 과거의 더 많은 텍스트에 대한 응답의 마지막 위치를 추적하고 정기적으로 설문 조사를 유지하려는 것이다. 귀하의 경우 차이점은 complete 이벤트에 가입하고 폴링을 중지 할 수 있다는 것입니다.


  2. 2.텍스트 나 HTML을 출력 할 때 이것은 매우 간단합니다. 다음은 예입니다.

    텍스트 나 HTML을 출력 할 때 이것은 매우 간단합니다. 다음은 예입니다.

    (그러나 출력 JSON하려고하면 당신은 내가 더 아래를 해결거야하는 문제로 실행됩니다.)

    header('Content-type: text/html; charset=utf-8');
    function output($val)
    {
        echo $val;
        flush();
        ob_flush();
        usleep(500000);
    }
    output('Begin... (counting to 10)');
    for( $i = 0 ; $i < 10 ; $i++ )
    {
        output($i+1);
    }
    output('End...');
    
    <!DOCTYPE>
    <html>
        <head>
            <title>Flushed ajax test</title>
            <meta charset="UTF-8" />
            <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        </head>
        <body>
            <script type="text/javascript">
            var last_response_len = false;
            $.ajax('./flushed-ajax.php', {
                xhrFields: {
                    onprogress: function(e)
                    {
                        var this_response, response = e.currentTarget.response;
                        if(last_response_len === false)
                        {
                            this_response = response;
                            last_response_len = response.length;
                        }
                        else
                        {
                            this_response = response.substring(last_response_len);
                            last_response_len = response.length;
                        }
                        console.log(this_response);
                    }
                }
            })
            .done(function(data)
            {
                console.log('Complete response = ' + data);
            })
            .fail(function(data)
            {
                console.log('Error: ', data);
            });
            console.log('Request Sent');
            </script>
        </body>
    </html>
    

    이 (가 완전히로드되기 전에) 당신이 완전한 개체가 될 때까지, 구문은 항상 유효하지 않을 것이기 때문에 점진적으로 하나의 JSON 객체를로드 실제로 수 없습니다.

    당신의 응답은 여러 JSON 객체, 연이어있는 경우 그러나, 그것은 그들이 파이프를 내려와으로, 한 번에 하나를로드 할 수 있습니다.

    그래서 난 이상 내 코드를 쥐게 ...

    응용 프로그램 / JSON으로 변경을하지 귀하의 헤더를 수행 - 나는 이런 짓을 그리고 그것은 나를 3 일 동안 인터넷 검색을했다. 응답 유형은 응용 프로그램 / JSON 응답 할 때까지 브라우저 대기가 완전히 완료 같이 완료되면. 전체 응답은 다음이 JSON 가리키고 있는지 확인하기 위해 구문 분석됩니다. 그러나 전체 응답은 {...} {...} {...}; 어떤 유효한 JSON 아닙니다. jqXHR.done 방법은 전체 응답이 JSON로 구문 분석 할 수 없기 때문에 오류가 발생했습니다 가정합니다.

    코멘트에서 언급 한 바와 같이, 당신은 사용하여 클라이언트 측에서이 검사를 비활성화 할 수 있습니다 :

    $.ajax(..., {dataType: "text"})
    

    어떤 사람들은이 유용한을 찾아 낸다.


  3. 3.사용 XMLHttpRequest.js

    사용 XMLHttpRequest.js

    https://github.com/ilinsky/xmlhttprequest

    http://code.google.com/p/xmlhttprequest

    PHP와 롱 폴링을 사용하려면 :

    output.php :

    <?php
    header('Content-type: application/octet-stream');
    
    // Turn off output buffering
    ini_set('output_buffering', 'off');
    // Turn off PHP output compression
    ini_set('zlib.output_compression', false);
    // Implicitly flush the buffer(s)
    ini_set('implicit_flush', true);
    ob_implicit_flush(true);
    // Clear, and turn off output buffering
    while (ob_get_level() > 0) {
        // Get the curent level
        $level = ob_get_level();
        // End the buffering
        ob_end_clean();
        // If the current level has not changed, abort
        if (ob_get_level() == $level) break;
    }
    // Disable apache output buffering/compression
    if (function_exists('apache_setenv')) {
        apache_setenv('no-gzip', '1');
        apache_setenv('dont-vary', '1');
    }
    
    // Count to 20, outputting each second
    for ($i = 0;$i < 20; $i++) {
        echo $i.str_repeat(' ', 2048).PHP_EOL;
        flush();
        sleep(1);
    }
    

    run.php :

    <script src="http://code.jquery.com/jquery-1.6.4.js"></script>
    <script src="https://raw.github.com/ilinsky/xmlhttprequest/master/XMLHttpRequest.js"></script>
    
    <script>
    $(function() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', '/longpoll/', true);
        xhr.send(null);
        var timer;
        timer = window.setInterval(function() {
            if (xhr.readyState == XMLHttpRequest.DONE) {
                window.clearTimeout(timer);
                $('body').append('done <br />');
            }
            $('body').append('state: ' + xhr.readyState + '<br />');
            console.log(xhr.responseText);
            $('body').append('data: ' + xhr.responseText + '<br />');
        }, 1000);
    });
    </script>
    

    이 출력합니다 :

    state: 3
    data: 0
    state: 3
    data: 0 1
    state: 3
    data: 0 1 2
    state: 3
    data: 0 1 2 3
    state: 3
    data: 0 1 2 3 4
    ...
    ...
    ...
    state: 3
    data: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    state: 3
    data: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    state: 3
    data: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    done
    state: 4
    data: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
    

    IE를 들어 당신은 XDomainRequest로 볼 필요가

    http://blogs.msdn.com/b/ieinternals/archive/2010/04/06/comet-streaming-in-internet-explorer-with-xmlhttprequest-and-xdomainrequest.aspx

    http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx


  4. 4.당신이 당신의 서버가 스트림 말 때문에 (비동기) 친절하고 JQuery와 솔루션을 찾고 있었다, 당신은 jQuery를 스트림 플러그인을 체크 아웃 한?

    당신이 당신의 서버가 스트림 말 때문에 (비동기) 친절하고 JQuery와 솔루션을 찾고 있었다, 당신은 jQuery를 스트림 플러그인을 체크 아웃 한?

    정말 쉽게 사용할 수 있나요 당신이 정말로 대해 많은 아무것도 걱정하지 할 수 있습니다. 그것은뿐만 아니라 꽤 좋은 문서가있다.


  5. 5.여기 사용 JQuery와 (영업 요청에 따라) 달성하기위한 간단한 방법이다 :

    여기 사용 JQuery와 (영업 요청에 따라) 달성하기위한 간단한 방법이다 :

    우선, (이 응답의 하단에 첨부 된)에서 코드 https://gist.github.com/chrishow/3023092 아래를 실행하여 지원을 onreadystatechange에 AJAX 오브젝트를 확장한다. 그런 다음 새 텍스트 xhr.responseText를 확인할 것을 onreadystatechange 함수를 사용하여 AJAX 호출합니다.

    당신도 애호가 얻고 싶었다 경우에서 responseText 데이터 당신은) 여기에 설명 된 바와 같이, 읽을 때마다 취소 할 수 있습니다.

    예를 들어,를 사용하여 콘솔 창 내부 덩어리에서 https://code.jquery.com/jquery-1.5.js에서 응답 출력을 다운로드 할, https://jsfiddle.net/g1jmwcmw/1/ 참조 (브라우저에서 열기 HTML 페이지에 복사 만 가능) 아래 코드 :

    <!-- jquery >= 1.5. maybe earlier too but not sure -->
    <script src=https://code.jquery.com/jquery-1.5.min.js></script>
    <script>
    /* One-time setup (run once before other code)
     *   adds onreadystatechange to $.ajax options
     *   from https://gist.github.com/chrishow/3023092)
     *   success etc will still fire if provided
     */
    $.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
        if ( options.onreadystatechange ) {
            var xhrFactory = options.xhr;
            options.xhr = function() {
                var xhr = xhrFactory.apply( this, arguments );
                function handler() {
                    options.onreadystatechange( xhr, jqXHR );
                }
                if ( xhr.addEventListener ) {
                    xhr.addEventListener( "readystatechange", handler, false );
                } else {
                    setTimeout( function() {
                        var internal = xhr.onreadystatechange;
                        if ( internal ) {
                            xhr.onreadystatechange = function() {
                                handler();
                                internal.apply( this, arguments ); 
                            };
                        }
                    }, 0 );
                }
                return xhr;
            };
        }
    });
    
    // ----- myReadyStateChange(): this will do my incremental processing -----
    var last_start = 0; // using global var for over-simplified example
    function myReadyStateChange(xhr /*, jqxhr */) {
        if(xhr.readyState >= 3 && xhr.responseText.length > last_start) {
            var chunk = xhr.responseText.slice(last_start);
            alert('Got chunk: ' + chunk);
            console.log('Got chunk: ', chunk);
            last_start += chunk.length;
        }
    }
    
    // ----- call my url and process response incrementally -----
    last_start = 0;
    $.ajax({
      url: "https://code.jquery.com/jquery-1.5.js", // whatever your target url is goes here
      onreadystatechange: myReadyStateChange
    });
    
    </script>
    

  6. 6.나는 허용되는 최대 크기 제한에 계속 실행 큰 JSON 페이로드와 그리드를 공급했다. I는 MVC와 jQuery를 사용하고, 상기 I-AlexMorley 핀치 용액 적응 그래서.

    나는 허용되는 최대 크기 제한에 계속 실행 큰 JSON 페이로드와 그리드를 공급했다. I는 MVC와 jQuery를 사용하고, 상기 I-AlexMorley 핀치 용액 적응 그래서.

    서버 코드는 "웹 API를 사용하여 스트리밍 데이터"에서였다. 또한 https://github.com/DblV/StreamingWebApi.

    public class StreamingController : ApiController
    {
    
        [HttpGet]
        [ActionName("GetGridDataStream")]
        public HttpResponseMessage GetGridDataStream(string id)
        {
            var response = Request.CreateResponse();
            DynamicData newData = new DynamicData();
            var res = newData.GetDataRows(id);
            response.Content = new PushStreamContent((stream, content, context) =>
            { 
                foreach (var record in res)
                {
                    var serializer = new JsonSerializer();
                    using (var writer = new StreamWriter(stream))
                    {
                        serializer.Serialize(writer, record);
                        stream.Flush();
                    }
    
                   // Thread.Sleep(100);
                }
    
                stream.Close();
            });
    
            return response;
        }
    }
    

    이 쉼표의 경계를 성공적으로 파싱 할 JSON []를 둘러싸 필요 {JSON 오브젝트} {JSON 객체 {}} JSON 객체들의 스트림을 생성.

    클라이언트 코드는 이렇게 누락 된 문자를 제공했다 :

     var jsonData = {}; 
    
     $.ajax("api/Streaming/GetGridDataStream/" + viewName, {
        xhrFields: {
                onprogress: function (e) { 
                    // console.log(this_response);
                }
            }
        }, { dataType: "text" }) //<== this is important for JSON data
        .done(function (data) { 
    
            data = "[" + data.replace(/\}\{/gi, "},{") + "]";
    
            jsonData["DataList"] = JSON.parse(data);
            //more code follows to create grid
        })
        .fail(function (data) {
            console.log('Error: ', data);
        });
    

    나는 이것이 닷넷 MVC와 jQuery를 사용하여 사람을 도움이되기를 바랍니다.

  7. from https://stackoverflow.com/questions/7740646/jquery-read-ajax-stream-incrementally by cc-by-sa and MIT license