약속의 유일한 문제는 IE가 약속을 지원하지 않는다는 것입니다. 에지는 않지만, IE 10의 많음이있다 11가 아웃 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (하단에 호환성)
따라서 JavaScript는 단일 스레드입니다. 비동기 호출을하지 않으면 예상대로 작동합니다. 기본 JavaScript 스레드는 코드에 표시되는 순서대로 다음 함수를 실행하기 전에 하나의 함수를 완전히 실행합니다. 동기 함수의 순서를 보장하는 것은 쉽지 않습니다. 각 함수는 호출 된 순서대로 완전히 실행됩니다.
동기 함수를 원자 단위 작업으로 생각하십시오 . 기본 JavaScript 스레드는 명령문이 코드에 나타나는 순서대로이를 완전히 실행합니다.
그러나 다음 상황과 같이 비동기 호출을 처리하십시오.
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
이것은 당신이 원하는 것을하지 않습니다 . 기능 1, 기능 2 및 기능 3을 즉시 실행합니다. div 플래시가로드되고 사라졌지 만 ajax 호출이 거의 완료되지는 않았지만 makeAjaxCall()
반환되었습니다. 복잡한 것은 makeAjaxCall()
주요 JavaScript 스레드의 각 스핀에 의해 조금씩 진행되는 덩어리로 작업을 나눕니다 . 비동기 적으로 작동합니다. 그러나 한 번의 스핀 / 런 동안 동일한 메인 스레드가 동기식 부분을 빠르고 예측 가능하게 실행했습니다.
그래서, 내가 그것을 다루는 방식 : 내가 말했듯이 기능은 원자 작업 단위입니다. 함수 1과 2의 코드를 결합했습니다. 비동기 호출 전에 함수 1의 코드를 함수 2에 넣습니다. 함수 1을 제거했습니다. 비동기 호출을 포함하여 모든 것을 순서대로 예측 가능하게 실행합니다.
그런 다음 비동기 호출이 완료되면 기본 JavaScript 스레드를 여러 번 회전 한 후 함수 3을 호출하게합니다 . 그러면 order가 보장됩니다 . 예를 들어, ajax를 사용하면 onreadystatechange 이벤트 핸들러가 여러 번 호출됩니다. 완료되었다고보고되면 원하는 최종 함수를 호출하십시오.
더 지저분하다는 데 동의합니다. 나는 코드가 대칭 적 인 것을 좋아하고, 함수가 한 가지 일 (또는 그에 가까운)을하는 것을 좋아하며, 어떤 식 으로든 아약스 호출이 디스플레이를 담당하는 것을 좋아하지 않습니다 (호출자에 대한 종속성 생성). 그러나 동기식 함수에 비동기 호출이 임베드 된 경우 실행 순서를 보장하려면 절충이 필요합니다. 그리고 IE 10을 코딩해야하므로 약속이 없습니다.
요약 : 동기식 호출의 경우 순서를 보장하는 것이 쉽지 않습니다. 각 함수는 호출 된 순서대로 완전히 실행됩니다. 비동기식 호출이있는 함수의 경우 순서를 보장하는 유일한 방법은 비동기식 호출이 완료되는시기를 모니터링하고 해당 상태가 감지되면 세 번째 함수를 호출하는 것입니다.
JavaScript 스레드에 대한 설명은 https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 및 https://developer.mozilla.org/en-US/docs/Web/JavaScript/를 참조하십시오. EventLoop
또한이 주제에 대해 비슷한 비슷한 등급의 질문이 있습니다 .3 개의 함수를 하나씩 실행하려면 어떻게해야합니까?
firstFunction
정확히 무엇을 비 동기화합니까? 어느 쪽이든-약속을 확인하십시오