Promise, async, setTimeout 비동기식 실행 순서 문제
3668 단어 프런트 엔드PromiseasyncsetTimeout비동기
제목 1:
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
const newPromise6 = new Promise(function(resolve, reject) {
resolve(console.log('promise1'));
});
newPromise6.then(function() {
console.log('promise2');
}).then(function() {
console.log('promise3');
});
console.log('script end'); chrome ?
결과: script start promise1 script end promise2 promise3 setTimeout
해석: 비동기 작업 사이에는 차이가 존재하기 때문에 실행 우선순위도 다르다.크게 마이크로태스크(microtask, 예를 들어 Promise, MutaionObserver 등)와 매크로태스크(macrotask, 예를 들어 setTimeout, setInterval, I/O 등)로 나뉜다.
1. setTimeout 타이머는 js 작업 대기열의 매크로 작업에 속합니다.작업 대기열을 실행 창고에 넣고 실행 라인이 순서대로 실행되기를 기다리는 것을 가리킨다.마이크로 0을 설정할 수 있지만, 이번 라운드 실행 환경의 **를 기다려야 합니다
** 실행이 끝난 후에야 실행할 수 있습니다.2,promisees6의 비동기 문법은 js퀘스트 대기열의 마이크로퀘스트에 속한다.이번 라운드 매크로 작업을 수행하는 과정에서promise를 만나면 라운드 실행 과정의 마이크로 작업에 끼워 넣습니다.이 라운드 **
,
**.실행이 끝나면 다음 작업 대기열을 시작합니다.제목 2:
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
console.log("settimeout");
},0);
async1();
new Promise(function (resolve) {
resolve(console.log("promise1"));
}).then(function () {
console.log("promise2");
});
console.log('script end');
답: script start async1 start async2 promise1 script end async1 end promise2 settimeout
제목 3:promise를 앞에 넣고 then과 await를 비교해 보세요
new Promise(function (resolve) {
resolve(console.log("promise1"));
}).then(function () {
console.log("promise2");
});
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
console.log("settimeout");
},0);
async1();
console.log('script end');
답: script start async1 start async2 promise1 script end promise2 async1 end settimeout
해석: 3. async await 비동기 문법은promise를 바탕으로 그 문법 설탕으로 비동기화를 동기화 작업처럼 한다.async를 사용하면 함수체에return XX가 있어 비동기promise로 포장됩니다.resolve('XX'), 현식return이 없으면async도 마찬가지로promise로 포장됩니다.resolve(‘undefined’);
주의:await는 js가 간다는 것을 상징합니다.**
, , async
**, 이번 라운드 실행 주기 내의 임무를 수행하고 이번 라운드의 매크로 작업(동기화 작업)이 완성된 후에 async로 돌아와서 이전 await의 함수의 반환 값을 기다립니다. 반환 값이 비동기promise라면promise에 넣을 것입니다.resolve () 마이크로퀘스트 (비동기 퀘스트 실행 창고), 앞에 있는 비동기 퀘스트 실행이 끝난 후에awaitpromise를 받습니다.resolve () 의 값, 그 다음에await 뒤의 논리를 실행합니다. 만약await 함수체가 비동기promise가 아니라면 그 뒤의 논리를 실행합니다.?궁극대 boss
async function async1() {
console.log("async1 start");
await async2();
const newPromise6 = new Promise(function(resolve, reject) {
resolve(console.log('promise11111'));
}).then(() => {console.log('then2222222')});
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
console.log("settimeout");
},0);
async1();
new Promise(function (resolve) {
resolve(console.log("promise1"));
}).then(function () {
console.log("promise2");
});
console.log('script end');
답: script start async1 start async2 promise1 script end promise11111 async1 end promise2 then22222 settimeout
직접 두드려보고 이해해봐~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Vue.js】컴포넌트의 3개의 네비게이션 가드일에서 사용하게 되었기 때문에 1부터 Vue.js에 대해 배웠다. 그 이름에서 알 수 있듯이 무언가를 가드하기위한 처리로, 대체로 페이지 천이 전에 특정 처리를 실행시켜 페이지 천이시키지 않게 한다. Vue.js의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.