손 으로 쓴 Promise - 자신 이 Promise 대상 을 봉인 합 니 다.
34599 단어 JavaScript
코드:https://github.com/fu-x/promise 우선 Promise 에 대한 분석 이 필요 합 니 다.
MyPromise 클래스 설명
class MyPromise {} // MyPromise
Promise 의 세 가지 상태: pending, fulfilled, rejected
우 리 는 클래스 에서 세 개의 정적 상수 를 정의 해 야 한다.
static PENDING = 'pending'; // pending
static FULFILLED = 'fulfilled'; // fulfilled
static REJECTED = 'rejected'; // rejected
Promise 기본 방법 (constructor)
constructor(executor) { // , 。
this.status = MyPromise.PENDING; //
this.value = null;
this.callbacks = []; // pending
try { //
executor(this.resolved.bind(this), this.rejected.bind(this)); //
} catch (error) {
this.rejected(error) // rejected
}
}
resolved 방법: 성공 적 인 비동기 함수 실행
resolved(value) { //
if (this.status === MyPromise.PENDING) { // , pending
this.status = MyPromise.FULFILLED; // fulfilled
this.value = value;
this.callbacks.forEach(callback => { // , pending
callback.onFulfilled(this.value);
})
}
}
rejected 방법: 실행 실패 한 비동기 함수
rejected(error) { //
if (this.status === MyPromise.PENDING) { // , pending
this.status = MyPromise.REJECTED; // rejected
this.value = error;
this.callbacks.forEach(callback => { // , pending
callback.onRejected(this.value);
})
}
}
promise 의 개인 적 인 방법: then
onFulfilled
, onRejected
// then() 。 onFulfilled onRejected
then(onFulfilled, onRejected) {
// , , then
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : () => this.value;
onRejected = typeof onRejected === 'function' ? onRejected : () => this.value;
// ,then MyPromise
let myPromise2 = new MyPromise((resolve, reject) => {
// pending, 。
if (this.status === MyPromise.PENDING) {
this.callbacks.push({
onFulfilled: value => {
setTimeout(() => { // then
let result = onFulfilled(value);
if(result === myPromise2){ // , promise
throw new TypeError('Chaining cycle detected');
}
try { //
if(result instanceof MyPromise){ // promise
result.then(resolve, reject); // .then
}else{
resolve(result); // then promise, resolve, then
}
} catch (error) {
reject(error);
}
})
},
onRejected: value => {
setTimeout(() => { // then
let result = onRejected(value);
if(result === myPromise2){ // , promise
throw new TypeError('Chaining cycle detected');
}
try { //
if(result instanceof MyPromise){ // promise
result.then(resolve, reject); // .then
}else{
resolve(result); // then promise, resolve, then
}
} catch (error) {
reject(error);
}
})
}
})
// ,
} else if (this.status === MyPromise.FULFILLED) {
setTimeout(() => { // then
let result = onFulfilled(this.value);
if(result === myPromise2){ // , promise
throw new TypeError('Chaining cycle detected');
}
try { //
if(result instanceof MyPromise){ // promise
result.then(resolve, reject); // .then
}else{
resolve(result); // then promise, resolve, then
}
} catch (error) {
reject(error);
}
})
// ,
} else if (this.status === MyPromise.REJECTED) {
setTimeout(() => { // then
let result = onRejected(this.value);
if(result === myPromise2){ // , promise
throw new TypeError('Chaining cycle detected');
}
try { //
if(result instanceof MyPromise){ // promise
result.then(resolve, reject); // .then
}else{
resolve(result); // then promise, resolve, then
}
} catch (error) {
reject(this.value);
}
})
}
})
return myPromise2;
}
promise 의 정적 방법: resolve
// promise resolve
static resolve(value){
return new MyPromise((resolve, reject)=>{ // resolve promise
if(value instanceof MyPromise){ // promise
value.then(resolve, reject); // then , promise
}else{
resolve(value); // promise ,
}
})
}
promise 의 정적 방법: reject
// promise reject
static reject(value){
return new MyPromise((resolve, reject)=>{ // reject promise
reject(value); //
})
}
promise 의 정적 방법: all
// promise all, promise , promise
// promise , promise ,
static all(promises){
return new MyPromise((resolve, reject)=>{
const values = [];
promises.forEach(promise=>{
promise.then((data)=>{
values.push(data);
if(values.length === promises.length){
resolve(data);
}
}, (error)=>{
reject(error);
})
})
})
}
promise 의 정적 방법: race
// promise race, promise
// promise promise
static race(promises){
return new MyPromise((resolve, reject)=>{
promises.forEach(promise=>{
promise.then(data=>{
resolve(data);
}, error=>{
reject(error);
})
})
})
}
여기 서 우리 Promise 는 패키지 가 완성 되 었 습 니 다. 복잡 해 보이 지만 모든 방법 과 속성의 역할 을 알 면 그 논리 가 간단 하 다 는 것 을 알 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.