스크립트 실행 중에 AJAX 콜이 반환되면 JavaScript는 어떻게 됩니까?
AJAX를 사용하여 합니다.myCallback
에이잭스
후 JavaScript라는 가정합니다.myFunction
.myCallback
비동기적으로 호출됩니다.
어떤 작업이 다른 작업보다 우선합니까?둘 다 동시에 달려요?어떻게 되는 거죠?
후 JavaScript라는 가정합니다.
myFunction
.myCallback
비동기적으로 호출됩니다.어떤 작업이 다른 작업보다 우선합니까?둘 다 동시에 달려요?어떻게 되는 거죠?
브라우저의 JavaScript는 단일 스레드입니다(Web worker를 사용하는 것을 금지하며, 그 구문은 명시적입니다).그렇게myFunction
는 반환될 때까지 실행됩니다.특정 주의사항이 있습니다(계속 읽어주세요.Ajax 계층이 작업을 완료하는 동안 myFunction
가 실행되고 있어(그럴 가능성이 매우 높으며), 콜백을 호출해야 합니다.콜은 큐잉됩니다.다음 번에 코드가 생성되면 큐 내의 다음 콜이 트리거됩니다.
그렇다면, 우리는 인종 상황에 대해 걱정할 필요가 없는 것처럼 보일지도 모른다.그건 대부분 사실이지만, 미묘한 점도 있어요.예를 들어 다음 코드를 생각해 보겠습니다.
var img = document.createElement('img');
img.src = /* ...the URL of the image... */;
img.onload = function() {
// Handle the fact the image loaded
foo();
};
doSomethingElse();
doYetAnotherThing();
의 JavaScript는 이기 때문에 JavaScript를 수 .load
벤트 할할 ?? ?? ??
틀렸어.
JavaScript 코드는 싱글 스레드이지만 다른 환경에서는 그렇지 않을 수 있습니다.그렇게 될 수 있습니다.img.src
수 있는 를 가지고 것을 할 수 에, 「」를 합니다load
의 img
사이사이에img.src = ...
및 " " "img.onload = ...
회선입니다. 핸들러가 아직 연결되어 있지 않기 때문에 전화를 받을 수 없습니다. 핸들러를 연결했을 때 이미 이벤트가 발생했기 때문입니다.
그러나 이러한 행을 반대로 하면 큐잉의 효과를 알 수 있습니다.
var img = document.createElement('img');
img.onload = function() {
// Handle the fact the image loaded
foo();
};
img.src = /* ...the URL of the image... */;
doSomethingElse();
doYetAnotherThing();
이제 설정하기 전에 이벤트를 잠그고 있습니다.src
가 「」간에 img.src = ...
및 " " "doSomethingElse
line (브라우저에 이미지가 캐시되어 있기 때문에)핸들러 콜백이 큐잉 됩니다 doSomethingElse
★★★★★★★★★★★★★★★★★」doYetAnotherThing
실행됩니다.제어가 코드에서 벗어나야 큐잉된 핸들러 콜이 최종적으로 실행됩니다.자바스크립트
눈에 띄지 않는 방법으로 호스트 환경에 양보할 수도 있습니다.를 들어, 「」를 호출하는 으로써, 「」를 호출됩니다.alert
그 confirm
,prompt
이러한 기능은 이벤트 구동 기능이 아니기 때문에 현대의 JavaScript에서 볼 수 있습니다.대신 모달창이 뜨는 동안 JavaScript 실행이 중단됩니다.bobince가 여기서 자세히 논의한 것처럼, 그 모달(modal)이 표시되는 동안 다른 코드가 실행되지 않는다는 것을 의미하지는 않습니다.아직 싱글 스레드이지만, 1개의 스레드는 (모달에 의해) 한 곳에 정지되어 있고, 그 사이에 다른 곳에서 코드를 실행하기 위해 사용되고 있습니다.정말 미세한 차이입니다.(Bob은 이벤트 처리도 몇 가지 지적하고 있습니다)focus
example - 이 규칙을 위반하는 것처럼 보이지만 위반되지 않습니다.그의 예에서는 focus
이치노사용자가 자신의 함수를 호출한 것과 다르지 않습니다).에서 코드가 , BOB를 호출함).blur
★★★★★★★★★★★★★★★★★」focus
」를 참조해 주세요.
)alert
그리고 특히 그 숨결은 모든 종류의 악의를 일으킨다, 특히 주변focus
★★★★★★★★★★★★★★★★★」blur
18살 때, 18번역하면 18번입니다
답변의 첫머리에 언급된 경고는 다음과 같습니다. 특히, 히,라면, 약 andmyFunction
®alert
적어도 파이어폭스에서는 ajax 완료 콜백이 다음 중 실행됩니다.alert
(다른 대부분의 브라우저에서는 사용할 수 없습니다).어떤 일이 일어나고 어떤 일이 일어나지 않는지 궁금하다면alerts
그리고 여기 테스트 페이지 테스트가 있습니다.setTimeout
테스트를 더 연장할 수 있습니다.
이 답변들은 모두 틀렸습니다[편집: 이 답변이 게시되었을 때 최소 3-4개 틀렸습니다].XHR 이벤트가 이벤트큐/풀에 배치됩니다.싱글 스레드 javascript 스레드가 비지 상태일 때 이벤트 풀에서 다음 이벤트를 가져와 해당 이벤트를 처리합니다.이러한 이벤트 중 하나가 XHR "AJAX" 요구입니다.이 요구는 콜백을 트리거하고 콜백이 실행됩니다.이것이 인터럽트가 없는 모든 이벤트 구동 시스템의 동작 방식입니다.
edit: JavaScript가 싱글 스레드화가 보증되는 링크에 대한 Joe의 답변을 업그레이드하고 있습니까?에 미묘한 엣지 케이스를 나타냅니다.매우 유익합니다.
Javascript 종류의 싱글 스레드는 "JavaScript가 싱글 스레드화가 보장됩니까?"를 참조하십시오.따라서 정답은 NO입니다.이벤트 핸들러와 기능을 동시에 실행할 수도 있고 실행하지 않을 수도 있습니다.
AJAX 콜백은 다음 이벤트루프에서 실행됩니다.
ajax는 와 동시에 호출합니다.따라서 Ajax 콜이 성공하면 콜백 함수가 호출되어 myfunction이 호출됩니다.
두 기능 모두에 경보('first one'), 경보('second one')를 넣고 어떤 모달 팝업이 먼저 표시되는지 확인함으로써 이를 빠르게 테스트할 수 있습니다.고객님의 코드가 주문에 정말로 영향을 받는 경우, 두 가지 모두에 조건부 체크를 하여 무언가를 방지/허용합니다.네이티브 js의 속도와 서버와의 풀 라운드 트립의 속도는 크게 다릅니다.무한 루프에서 실행되는 javascript가 없는 한 다른 함수 실행 중에 ajax 호출이 반환될 확률은 매우 낮습니다.
AJAX 콜은 "비관심적"입니다.즉, "콜을 끊고 나서, 내가 무엇을 다시 걸었으면 좋겠지요.
한마디로:
function DoSomething() { AJAXCall(Callback); }
... some time passes then ...
function Callback() { Done(); }
이러한 2개의 함수 호출 사이에 어떤 일이 일어날 수 있는 경우에도 응답이 반환될 때 콜백이 호출됩니다.이는 javascript 런타임은 싱글 스레드이지만 브라우저는 콜을 스택하여 어떤 순서로 발생시키기 때문입니다(아마도 콜이 이루어지지만 고정되지 않은 순서).
이전 웹 사이트를 열어본 것은 유감입니다.왜냐하면 호출이 돌아올 때마다 페이지의 다양한 부분이 채워지기 때문에 로드 시 여러 개의 AJAX 콜을 하는 전형적인 예가 있었기 때문입니다.
각 콜은 문서 로드 이벤트에 "첨부"되었지만 서버는 멀티스레드(및 그럴 가능성이 높기 때문에)가 가능하기 때문에 한 번에 1개의 콜만 실행할 수 있습니다.
javascript는 브라우저가 작은 코드 덩어리를 전달할 수 있는 가상 박스라고 생각하시면 됩니다.한 번에 실행할 수 있는 것은 1개뿐이지만 적절한 순서로 많은 스크립트를 실행할 수 있습니다(일반적으로 여러 개의 Ajax 호출에서는 서버가 언제 결과를 가지고 돌아올지 알 수 없기 때문에 이것은 예측할 수 없습니다).
하여 Ajax를 하는 myCallback
동기적으로 실행됩니다. ★★★★★★★★★★★★★★★★★.myCallback
다른 기능과 마찬가지로 먼저 실행한다고 하거나 마지막으로 실행한다고 합니다..
언급URL : https://stackoverflow.com/questions/6659108/what-happens-in-javascript-when-an-ajax-call-returns-while-the-script-is-executi
'programing' 카테고리의 다른 글
Oracle에서 with 절을 사용하여 테이블 생성 (0) | 2023.04.04 |
---|---|
최소화된 각도 javascript에서 알 수 없는 제공자를 디버깅하고 있습니다. (0) | 2023.04.04 |
Oracle에서 현재 열려 있는 커서 찾는 방법 (0) | 2023.03.25 |
Oracle SQL 날짜에서 시간을 제거하는 방법 (0) | 2023.03.25 |
반응에서 material-UI 선택 상자에서 기본값을 설정하는 방법은 무엇입니까? (0) | 2023.03.25 |