JavaScript Promise 실행 순서가 예상대로 선형이 아닌 이유는 무엇입니까?

DDD
풀어 주다: 2024-10-24 13:23:31
원래의
501명이 탐색했습니다.

Why is the JavaScript Promise execution order not linear as expected?

JavaScript Promise 실행 순서

문제

Promise를 사용하는 다음 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>
로그인 후 복사

출력은 다음과 같습니다.

<code class="text">1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6</code>
로그인 후 복사

질문은 실행 순서, 특히 숫자 1, 2, 3, 7 등에 관한 것입니다. 예상되는 선형 순서 1, 2, 3, 4, ...가 아닌 이유는 무엇입니까?

답변

Promise Execution Order

JavaScript 약속은 특정 실행 규칙을 따릅니다.

  1. 비동기 실행: Promise .then() 핸들러는 현재 실행 스레드가 완료된 후 비동기적으로 실행됩니다. 이는 메인 스레드를 차단하지 않고 비동기 작업을 완료할 수 있도록 하기 위한 것입니다.
  2. 중첩된 약속: 반환하지 않고 .then() 핸들러 내에서 새 약속을 생성하면 독립적인 약속 체인이 생성됩니다. 이러한 독립적인 Promise 체인에는 예측 가능한 실행 순서가 없습니다.

순서 분석

주어진 코드에서:

  • 초기 Promise는 즉시 해결되므로 .then() 핸들러(console.log(2, a))는 console.log(1)(23행) 후에 비동기적으로 실행됩니다.
  • 4행의 .then() 핸들러는 독립적인 Promise 체인을 생성합니다.
  • 12행의 .then() 핸들러는 비동기적으로 실행되는 또 다른 독립적인 Promise 체인을 생성합니다.
  • 19행의 .then() 핸들러는 다음과 같은 또 다른 독립적인 Promise 체인을 생성합니다. 비동기식으로 실행됩니다.
  • setTimeout()은 현재 실행 스레드가 완료된 후에 실행되는 콜백을 설정하지만 promise .then() 핸들러 전후에 실행된다는 보장은 없습니다.

비결정론적 실행

.then() 핸들러 내에서 생성된 독립적인 약속 체인에는 예측 가능한 실행 순서가 없으므로 3, 7, 4, 8, 9, 5, 10의 순서는 다음에 따라 달라집니다. 특정 Promise 엔진 구현.

권장 사항

비동기 작업에 대한 특정 실행 순서를 보장하려면 다음을 수행하는 것이 좋습니다.

  1. .then 내에서 독립적인 Promise 체인을 생성하지 마십시오. () 핸들러.
  2. Promise 체인을 연결하여 특정 실행 순서를 보장합니다.

주어진 예에서 .then(에서 Promise.resolve('C') Promise를 반환합니다. ) 4행의 핸들러는 약속 체인을 연결하고 예상되는 순차적 실행 순서를 생성합니다.

위 내용은 JavaScript Promise 실행 순서가 예상대로 선형이 아닌 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!