JS 에서 Promise 함수 then 의 비밀 탐구
Promise 대상 은 CommonJS 작업 팀 이 제시 한 규범 으로 비동기 작업 에 통 일 된 인 터 페 이 스 를 제공 하 는 것 이 목적 이다.
그럼 Promises 가 뭐 예요?
우선,그것 은 하나의 대상 이다.즉,다른 자 바스 크 립 트 대상 의 용법 과 다 를 바 없다.그 다음으로 에이전트 역할(proxy)을 하여 비동기 작업 과 반전 함수 간 의 중개 역할 을 합 니 다.이 는 비동기 작업 으로 하여 금 동기 화 작업 의 인 터 페 이 스 를 갖 추 게 하고 프로그램 이 정상 적 인 동기 화 운행 절 차 를 갖 추 게 하 며 리 셋 함 수 는 더 이상 끼 워 넣 을 필요 가 없다.
쉽게 말 하면 모든 비동기 임 무 는 바로 Promise 대상 으로 돌아 가 는 것 이 고 즉시 돌아 가기 때문에 동기 화 작업 의 절 차 를 사용 할 수 있다 는 것 이다.이 Promises 대상 은 then 방법 이 있 습 니 다.리 셋 함 수 를 지정 하여 비동기 작업 이 끝 난 후에 호출 할 수 있 습 니 다.
Promise 의 then 방법 은 이전 함수 의 실행 결 과 를 받 아들 일 수 있 고 다른 Promise 의 순서 집행 도 보장 할 수 있 습 니 다.이것 은 도대체 어떻게 하 는 것 입 니까?
원리 도(선도)
문제 수요
어떻게 여러 promise 순서 가 실 행 될 것 을 보증 합 니까?
실례:
var f1 = function (){
return new Promise(function (resolve, reject){
setTimeout(function (){
console.log("f1 ok!")
resolve("f1 ok!");
}, 1000)
});
}
var f2 = function (){
return new Promise(function (resolve, reject){
setTimeout(function (){
console.log("f2 ok!")
resolve("f2 ok!");
}, 3000)
});
}
var f3 = function (){
return new Promise(function (resolve, reject){
setTimeout(function (){
console.log("f3 ok!")
resolve("f3 ok!");
}, 2000)
});
}
물론 병행 하려 면 Promise.all 방법 이 생각 나 기 쉽다.
Promise.all([f1(), f2(), f3()]).then(function (data){
console.log(data)
})
// f1 ok!
// f3 ok!
// f2 ok!
// ["f1 ok!", "f2 ok!", "f3 ok!"]
순서대로 실행 하려 면:
f1().then(f2).then(f3)
// f1 ok!
// f2 ok!
// f3 ok!
//
function f(all) {
var promise = Promise.resolve();
all.forEach((p, index) => {
promise = promise.then(p)
})
}
f([f1, f2, f3])
그러면 문제 가 생 겼 습 니 다.then 은 어떻게 순서대로 실 행 했 습 니까?인 자 는 일반 함수 일 수도 있 고 promise 로 돌아 가 는 함수 일 수도 있 습 니 다.then 의 비밀
많은 promise 를 실현 하 는 라 이브 러 리 가 복잡 합 니 다.만약 에 자신 이 실현 한다 면 다음 과 같은 간단 한 코드 를 참고 할 수 있 습 니 다.
Promise.prototype.then = function(onFulfilled, onRejected) {
var promise = this;
return new Promise(function(resolve, reject) {
function handle(value) {
var ret = typeof onFulfilled === 'function' && onFulfilled(value) || value;
if (ret && typeof ret['then'] == 'function') {
ret.then(function(value) {
resolve(value);
}, function(reason) {
reject(reason);
});
} else {
resolve(ret);
}
}
function errback(reason) {
reason = typeof onRejected === 'function' && onRejected(reason) || reason;
reject(reason);
}
if (promise._status === 'PENDING') {
promise._resolves.push(handle);
promise._rejects.push(errback);
} else if (promise._status === FULFILLED) {
callback(promise._value);
} else if (promise._status === REJECTED) {
errback(promise._reason);
}
});
}
then 의 실현 에 중점 을 두 고 상기 코드 를 보면 then 마다 돌아 오 는 것 이 무엇 인지,새로운 Promise,새로운 Promise,새로운 Promise 입 니 다.두 번 째 중점 은 내부 에서 리 셋 함수 운행 결 과 를 처리 한 것 은 promise 의 판단 입 니 다.만약 에 이 promise 운행 이 끝 날 때 까지 기 다 려 야 resolve 가 상 태 를 바 꾸 는 것 입 니 다.관건 은 resolve 의 호출 시기 입 니 다.resolve 의 호출 시 기 를 기 다 려 야 아래로 실행 할 수 있 습 니 다.이 두 단 계 는 then 함수 의 관건 입 니 다.
좀 어 지 럽 죠?처음 그림 을 보 세 요.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.