JavaScript는 다른 프로세스를 차단하지 않고 데이터 가져오기, 애니메이션, 파일 처리와 같은 작업을 가능하게 하는 비동기식 특성으로 잘 알려져 있습니다. 약속은 비동기 작업을 우아하게 처리하는 핵심이며 코드를 더 깔끔하고 관리하기 쉽게 만듭니다. XPromise라는 이 프로젝트는 JavaScript Promise의 사용자 정의 구현으로, Promise 메커니즘이 내부적으로 작동하는 방식을 탐색하는 데 도움이 됩니다.
GitHub에서 전체 구현을 확인할 수 있습니다.
JavaScript의 Promise는 비동기 작업의 최종 완료 또는 실패를 나타내는 특수 개체입니다. Promise를 사용하면 작업이 언제 완료될지 모르더라도 작업 완료 후 실행할 작업을 대기열에 추가할 수 있습니다. Promise를 독특하게 만드는 요소는 다음과 같습니다.
XPromise와 같은 사용자 정의 Promise를 생성하면 내부 작동 방식을 더 깊이 이해할 수 있습니다.
XPromise의 코드를 살펴보고 JavaScript의 기본 Promise처럼 작동하게 만드는 각 구성 요소를 살펴보겠습니다.
XPromise는 PENDING, FULFILLED, REJECTED의 세 가지 상태를 정의하는 것으로 시작합니다.
const PENDING = "PENDING"; const FULFILLED = "FULFILLED"; const REJECTED = "REJECTED"; class XPromise { constructor(executor) { this.state = PENDING; this.queue = []; doResolve(this, executor); } // ... }
그런 다음 catch하고 마지막으로 이행, 거부 및 정리 시나리오를 처리합니다. XPromise가 연결을 달성하는 방법은 다음과 같습니다.
const PENDING = "PENDING"; const FULFILLED = "FULFILLED"; const REJECTED = "REJECTED"; class XPromise { constructor(executor) { this.state = PENDING; this.queue = []; doResolve(this, executor); } // ... }
핸들 함수는 Promise가 아직 보류 중인지 해결되었는지 결정합니다. 보류 중인 경우 나중에 실행되도록 핸들러가 대기열에 추가됩니다. Promise가 해결되면 즉시 핸들러를 처리합니다.
then(onFulfilled, onRejected) { const promise = new XPromise(() => {}); handle(this, { promise, onFulfilled, onRejected }); return promise; } catch(onRejected) { return this.then(null, onRejected); } finally(onFinally) { return this.then(onFinally, onFinally); }
완료 및 거부된 Promise에는 결과를 처리하기 위한 특별한 기능이 필요합니다. XPromise가 이를 달성하는 방법은 다음과 같습니다.
function handle(promise, handler) { while (promise.state !== REJECTED && promise.value instanceof XPromise) { promise = promise.value; } if (promise.state === PENDING) { promise.queue.push(handler); } else { handleResolved(promise, handler); } }
이행 및 거부:
대기 중인 처리기 마무리:
doResolve 함수는 해결 및 거부 호출을 래핑하여 실행기를 안전하게 실행하여 여러 번 호출되는 경우 추가 상태 변경을 방지합니다.
function fulfill(promise, value) { if (value === promise) { return reject(promise, new TypeError()); } if (value && (typeof value === "object" || typeof value === "function")) { let then; try { then = value.then; } catch (e) { return reject(promise, e); } if (typeof then === "function") { return doResolve(promise, then.bind(value)); } } promise.state = FULFILLED; promise.value = value; finale(promise); } function reject(promise, reason) { promise.state = REJECTED; promise.value = reason; finale(promise); }
이제 제대로 작동하는 XPromise가 있으므로 간단한 예를 들어 시험해 보겠습니다.
function doResolve(promise, executor) { let called = false; function wrapFulfill(value) { if (called) return; called = true; fulfill(promise, value); } function wrapReject(reason) { if (called) return; called = true; reject(promise, reason); } try { executor(wrapFulfill, wrapReject); } catch (e) { wrapReject(e); } }
Promise를 처음부터 다시 구현하면 JavaScript에서 비동기 프로그래밍이 어떻게 관리되는지에 대한 실무적인 통찰력을 얻을 수 있습니다.
코드에 대해 더 자세히 알아보려면 GitHub에서 XPromise 프로젝트를 확인하세요. 코드를 실험하고 자유롭게 사용자 정의하여 Promise 경쟁 조건, 연결 및 중첩과 같은 고급 기능을 살펴보세요!
위 내용은 XPromise 구축: 맞춤형 JavaScript Promise에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!