문제:
다음 스니펫은 JavaScript 사용을 보여줍니다. 약속하고 실행 순서가 흥미롭습니다.
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
결과는 실행 순서를 나타냅니다.
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
제기된 질문은 실행 순서가 1, 2가 아닌 이유입니다. , 3, 4..., 그리고 1, 2, 3, 4...의 기대치가 결과와 어떻게 다른가요?
답변:
댓글:
.then() 콜백에서 반환하지 않고 .then() 핸들러 내에서 Promise를 실행하면 상위 Promise와 동기화되지 않는 연결되지 않은 새로운 Promise 시퀀스가 생성됩니다. 방법. 이는 일반적으로 버그로 간주되며 일반적으로 의도된 동작이 아니기 때문에 일부 Promise 엔진은 발생 시 경고를 발행합니다. 유효한 사용 사례는 오류나 동기화가 문제가 되지 않는 '실행 후 잊어버리기' 작업일 수 있습니다.
.then() 핸들러 내의 Promise.resolve() 프라미스는 상위 프라미스 체인과 독립적으로 실행되는 새로운 프라미스 체인을 생성합니다. 체인. AJAX 호출과 같은 실제 비동기 작업에서는 연결이 끊긴 독립적인 약속 체인에 대해 예측 가능한 동작이 없습니다. 완료 순서를 알 수 없는 4개의 AJAX 호출을 병렬로 실행하는 것과 같이 완료 시점은 불확실합니다. 제공된 코드에서 모든 작업은 동기식이므로 일관된 동작이 발생하지만 Promise의 설계 목적은 비동기식 실행이므로 이에 의존해서는 안 됩니다.
요약:
라인별 분석:
결론:
Promise.resolve()의 특정 순서가 부족하여 .then() 핸들러 내에서 약속이 실행될 뿐만 아니라 다양한 엔진에 대한 .then() 핸들러 스케줄링과 setTimeout()의 불확정성은 연결 약속을 통해 실행 순서를 제어하는 것의 중요성을 강조합니다.
위 내용은 Promise 실행 순서가 JavaScript의 예상과 일치하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!