sourcecode

첫 번째 ajax 호출이 완료될 때까지 두 번째 ajax 호출 대기 금지

copyscript 2023. 9. 6. 22:13
반응형

첫 번째 ajax 호출이 완료될 때까지 두 번째 ajax 호출 대기 금지

페이지 로드 시 두 개의 아약스 콜을 실행하고 있습니다.데스크톱 브라우저에서 페이지를 열면 둘 다 예상대로 작동합니다.

그러나 안드로이드 브라우저(예: 크롬)에서 같은 페이지를 열면 두 번째 아약스 함수의 응답이 비동기성의 목적을 다소 무시하는 첫 번째 아약스 함수의 완료를 기다리고 있음을 알 수 있었습니다.둘 다 동시에 실행되지만 두 번째 함수는success는 첫 첫째이된만다이다tfers째y된'lxxsuccess기능.

스크린샷

Ajax Calls

안드로이드 브라우저가 아닌 데스크톱 브라우저에서 작동한다는 사실은 안드로이드에서 동시 비동기 호출을 차단하는 일종의 설정이 있을 것이라는 생각이 들게 합니다.

만약 그렇다면, 제가 그것을 비활성화할 수 있을까요?내 코드는 다음과 같습니다.

$(function(){           
       var intervalID = window.setInterval(function(){
                doAjax(); // this is the function which is waiting for completion of first ajax call
            }, 2000);

      // the first ajax call
      $.ajax({
    type:'post',
    url:'progress-insert.php', // basically is meant for insertion of records into db
    success:function(data)
    {
       clearInterval(intervalID);
    }   
     });
     
     function doAjax()
     {          
    $.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
                // do something
        }
    }); 
      }
     
});

SO 질문을 확인합니다.

현대 브라우저에서 동시에 연결할 수 있는 수에 대한 정보를 제공하는 브라우저 스코프를 가리키는 답변이 있습니다.한계에 도달했는지 여부를 테스트하는 한 가지 아이디어는 두 엔드포인트를 서로 다른 도메인에 호스팅하는 것입니다.브라우저가 작동하면 브라우저가 도메인당 1회의 호출을 제한한다는 것을 알 수 있지만 브라우저 범위 목록에서는 그렇지 않은 것으로 보입니다.

당신의 코드를 로컬로 실행해 보았으나 당신이 설명하고 있는 것과 같은 동작(Xcode iPhone 시뮬레이터 iOS7 및 모바일 사파리 사용)을 보지 못했습니다.

그리고, 당신은 두명이 있는것처럼 보입니다.$(function(){설정, 하나는 다른 하나로 포장됩니다.아마 그걸 고쳐서 변화를 가져올지...

유감스럽게도 모든 브라우저의 자바스크립트 구현은 싱글스레드 방식입니다. 즉, 비동기 호출은 서버에 대한 비동기식이지만 동일한 자바스크립트에 대한 비동기식이므로 이전 요청을 기다립니다.이를 극복하기 위해 할 수 있는 일은 요청 상태가 200 Ok / Success가 아닌 경우 변수에서 요청을 푸시하는 것입니다. 동일한 기능에 대해 더 이상 호출하지 마십시오. 샘플 코드는 다음과 같습니다.

requests.push($.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
              for(var i = 0; i < requests.length; i++)
              requests[i].abort();
        }
    })); 

이 완전한 접근 방식은 당신에게 도움이 될 것입니다.

CASE A ...한 번에 한 명의 아약스

<script type="text/javascript" >
//Global Variable
$.numx={loaded:false, timerx:0 }


// Document Ready
jQuery(function ($) {

    // button click to insert
    $("#button_click").on("click", function(){
         //Ajax call Insert...myabe help you the insert returns some in json
         $.getJSON( 'progress-insert.php', function(json) { 
              //the waiting function for insert is ready 
              $.numx.timerx=setInterval("waiting_insert()",50);
              if(json!=null){
                   // set to the global variable the insert is ready..and pass to continue 
                   $.numx.loaded=true;
                   // paste another actions to perform... 
               }
          });

    });

});



function waiting_insert(){
    if( $.numx.loaded==true){ 
                // tell to the waiting no more waiting
        clearInterval($.numx.timerx);
              // HERE perform the second ajax progress_update.php
        }
}
</script>

CASE B - 많은 AJAX가 설정된 간격을 제거하고 삭제합니다.interval and execute는 같은 함수에서 원하는 만큼 많은 ajax 호출이 있습니다...이것처럼.

<script type="text/javascript" >
// window load .. is charged in event load of page
$(window).load(function(){

     // two ajax calls at the same time

     $.ajax({
    type:'post',
    url:'progress-insert.php',
    success:function(data)
    {
       //do something
    }  
   });


    $.ajax({
        type:'post',
        url:'progress-update.php', // basically returns how many records have been inserted so far
        success:function(data)
        {
                // do something
        }
   });
});
</script>

jQuery 1.8 현재 사용 중인 Jquery 버전을 확인하십시오. sync: false는 이전 버전 비동기 false에서 더 이상 사용되지 않거나 $.ajaxSetup() 호출 동기화의 일부처럼 global로 설정되었을 수 있습니다...

이것은 당신의 php 파일에 세션을 쓰는 것 때문이라고 생각합니다.

사용하다

session_write_close(세션)

$_SESSION에 편지를 쓴 후

당신을 도와주길 바랍니다.

언급URL : https://stackoverflow.com/questions/20567962/prevent-second-ajax-call-from-waiting-till-completion-of-first-ajax-call

반응형