[JQUERY] jQuery를 AJAX를 점진적으로 스트리밍 읽어?
JQUERYjQuery를 AJAX를 점진적으로 스트리밍 읽어?
해결법
-
1.이 똑바로 최대의 자바 스크립트를 사용할 것입니다. 그 이유는 당신이 지속적으로 여론 조사를 원하고 화재에 대한 콜백을 기다릴 거라고이다. 당신은 이것에 대한 jQuery를 필요하지 않습니다, 그것은 꽤 간단합니다. 그들은 아약스 패턴 웹 사이트에서이에 대한 몇 가지 좋은 소스 코드가 있습니다.
이 똑바로 최대의 자바 스크립트를 사용할 것입니다. 그 이유는 당신이 지속적으로 여론 조사를 원하고 화재에 대한 콜백을 기다릴 거라고이다. 당신은 이것에 대한 jQuery를 필요하지 않습니다, 그것은 꽤 간단합니다. 그들은 아약스 패턴 웹 사이트에서이에 대한 몇 가지 좋은 소스 코드가 있습니다.
기본적으로, 당신은 단지 그 위치 과거의 더 많은 텍스트에 대한 응답의 마지막 위치를 추적하고 정기적으로 설문 조사를 유지하려는 것이다. 귀하의 경우 차이점은 complete 이벤트에 가입하고 폴링을 중지 할 수 있다는 것입니다.
-
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.사용 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.당신이 당신의 서버가 스트림 말 때문에 (비동기) 친절하고 JQuery와 솔루션을 찾고 있었다, 당신은 jQuery를 스트림 플러그인을 체크 아웃 한?
당신이 당신의 서버가 스트림 말 때문에 (비동기) 친절하고 JQuery와 솔루션을 찾고 있었다, 당신은 jQuery를 스트림 플러그인을 체크 아웃 한?
정말 쉽게 사용할 수 있나요 당신이 정말로 대해 많은 아무것도 걱정하지 할 수 있습니다. 그것은뿐만 아니라 꽤 좋은 문서가있다.
-
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.나는 허용되는 최대 크기 제한에 계속 실행 큰 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를 사용하여 사람을 도움이되기를 바랍니다.
from https://stackoverflow.com/questions/7740646/jquery-read-ajax-stream-incrementally by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 업로드하기 전에 파일 크기를 가져옵니다 (0) | 2020.10.09 |
---|---|
[JQUERY] 어떻게 jQuery를 약속을 사용하여 세 가지 비동기 호출을 체인합니까? (0) | 2020.10.09 |
[JQUERY] 어떻게 jQuery로 iframe이의 콘텐츠에 액세스하려면? (0) | 2020.10.09 |
[JQUERY] 나는 자바 스크립트에서 현재 실행중인 함수의 이름을받을 수 있나요? (0) | 2020.10.09 |
[JQUERY] .keyCode 대 .which (0) | 2020.10.09 |