Promise 및 async / await 는 무엇 입 니까?
4520 단어 Promiseasync/await자바 script
AJAX 의 등장 으로 브 라 우 저의 사용자 체험 이 질 적 으로 향상 되 었 습 니 다. 예전 처럼 (예 를 들 어 다음 페이지 를 보 려 면 전체 페이지 를 다시 불 러 와 야 합 니 다. AJAX 를 사용 하려 면 다음 페이지 의 데 이 터 를 부분 적 으로 불 러 와 서 DOM 을 다시 렌 더 링 해 야 합 니 다).
물론 AJAX 는 비동기 작업 으로 요청 이 성공 한 후에 반전 함 수 를 호출 합 니 다.반환 내용 을 가 져 와 야 할 때 다른 조작 을 하면 '반전 지옥' 에 빠 지기 쉽다.이 단 어 는 낯 설 지 않 고 자주 이런 상황 을 만 날 수 있다 고 믿 습 니 다. 가장 좋 은 방법 은 AJAX 매개 변수 처리, 반전 함수 에 들 어가 간단 한 포장 을 하 는 것 입 니 다.
그럼 이제 Promise 를 소개 하 겠 습 니 다. 어떤 물건 인지, 무엇 에 쓰 는 지...
Promise
공식 문서 자료
Promise 대상 은 비동기 작업 의 최종 상태 (완료 또는 실패) 와 이 비동기 작업 의 결과 값 을 표시 하 는 데 사 용 됩 니 다.
이것 은 비동기 작업 을 하 는 함수 이 고 작업 이 끝 난 후에 상태 로 돌아 가 성공 하거나 실패 한 것 이 분명 하 다.어떻게 쓰 는 지 한번 해 볼 게 요.
DEMO 1
function newPromise() {
return new Promise((resolve, reject) => {
resolve(" then ");
reject(" catch ");
})
}
let p = newPromise();
console.log(p);
p.catch((res) => {
console.log(res);
}).then((res) => {
console.log(res);
})
Promise 는 하나의 함 수 를 입력 해 야 합 니 다. 이 함 수 는 resolve, reject 두 가지 방법 을 받 습 니 다. Promise 의 prototype 에 대응 하 는 then 과 catch 입 니 다.
resolve: 성공 상 태 를 되 돌려 주 고 들 어 오 는 값 은 최종 then 방법 으로 실 행 됩 니 다.
reject: 실패 상 태 를 되 돌려 주 고 들 어 오 는 값 은 catch 방법 으로 실 행 됩 니 다.
로그 해 보 겠 습 니 다. (resolve, reject 는 앞의 것 만 실행 하기 때문에 효 과 를 보 려 면 따로 실행 해 야 합 니 다)
resolve 방법 을 실 행 했 을 때 Promise 의 then 방법 도 실 행 됐 지만 값 을 되 돌려 주지 않 았 습 니 다.
DEMO 2
function getName() {
return new Promise((resolve, reject) => {
let name = "Tom";
console.log(name);
setTimeout(function () {
name = "Jack";
resolve(name);
}, 2000);
console.log(name);
})
}
let name = getName();
console.log(name);
name.catch((res) => {
console.log(res);
}).then((res) => {
console.log(res);
})
우 리 는 setTimeout 을 사용 하여 요청 을 시 뮬 레이 션 했 습 니 다. "Jack" 을 되 돌려 name 변수 에 저장 한 다음 resolve 방법 으로 "요청" 을 then 방법 에 전달 하고 log 합 니 다.
setTimeout 은 비동기 동작 이기 때문에 'Tom' 을 두 번 직접 출력 한 다음 Promise 대상 을 출력 하고 2s 이후 then 방법 을 실행 하여 'Jack' 을 출력 합 니 다. 이것 이 바로 Axios HTTP 라 이브 러 리 의 실현 원리 입 니 다.
Axios 부분 코드:
module.exports = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject){
......
});
};
async
공식 문서 자료
async function 성명 은 AsyncFunction 대상 으로 돌아 가 는 비동기 함 수 를 정의 하 는 데 사 용 됩 니 다.비동기 함 수 는 이벤트 순환 을 통 해 비동기 로 실행 되 는 함 수 를 말 하 며, 암시 적 인 Promise 를 통 해 결 과 를 되 돌려 줍 니 다.그러나 코드 가 비동기 함 수 를 사용 하면 문법 과 구 조 는 표준 동기 함수 와 같 습 니 다.이것 은 보기 에는 좀 복잡 할 수 있 습 니 다. 간단하게 말하자면, async function 의 성명 함수 방식 은 이 함 수 를 비동기 함수 로 정의 합 니 다. 이것 은 Promise 대상 을 되 돌려 줍 니 다. 우 리 는 async 를 Promise 의 문법 사탕 으로 이해 할 수 있 습 니 다.
DEMO 3
async function asyncFun() {
console.log(" ");
}
let fun = asyncFun();
console.log(fun);
fun.catch((res) => {
console.log(res);
}).then((res) => {
console.log(res);
});
asyncFun 은 Promise 대상 을 되 돌려 주 었 습 니 다. 그러나 then 방법 은 undefined 를 출력 하 였 습 니 다. 이것 은 asyncFun 방법 에서 return 이 없 기 때문에 기본적으로 undefined 로 돌아 갑 니 다.
await
공식 문서 자료
await 조작 자 는 Promise 대상 을 기다 리 는 데 사 용 됩 니 다.그것 은 비동기 함수 async function 에서 만 사용 할 수 있 습 니 다.이것 은 매우 직접적 입 니 다. Promise 대상 이 그의 정 보 를 되 돌려 주 기 를 기다 리 지만 async 가 설명 한 함수 에서 만 사용 할 수 있 습 니 다.
DEMO 4
function getName() {
return new Promise((resolve, reject) => {
let name = "Tom";
setTimeout(function () {
name = "Jack";
resolve(name);
}, 2000);
})
}
async function asyncFun() {
let name = await getName();
console.log(name);
}
asyncFun();
아니면 그 name 을 가 져 오 는 방법 입 니까? 출력 값 을 보 세 요.
2s 이후 로그 "Jack" 을 출력 합 니 다.
await 를 사용 한 후에 우 리 는 getName 의 반환 값 을 얻 었 습 니 다. 그 전에 then 방법 이 필요 합 니 다. 이 제 는 '비슷 해 보 여요' 동기 화 방식 으로 얻 을 수 있 습 니 다. 왜 동기 화 처럼 보 입 니까? asyncFun 은 비동기 함수 이기 때 문 입 니 다.
DEMO 5
async function asyncFun() {
let name = await getName();
console.log(name);
return name;
}
console.log(asyncFun());
생각해 보 세 요. "Jack" 을 출력 할 수 있 습 니까?
사실은 안 됩 니 다. asyncFun 은 비동기 함수 이기 때문에 돌아 오 는 것 은 Promise 대상 입 니 다.
이상 이 모든 내용 입 니 다. 이것 도 제 가 Axios 와 anync / awat 를 사용 하면 서 겪 은 문제 입 니 다. 시간 이 좀 걸 려 서 이 물건 들 의 원 리 를 완전히 알 게 되 었 습 니 다.
정리 하 는데 3 시간 이 넘 게 걸 릴 줄 몰랐어 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Promise 단순화텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.