비동기 발전 과정
1 callback
코드:
function sleepByCb(cb) {
setTimeout(function () {
cb()
}, 1000)
}
function testCb() {
console.log(' ')
sleepByCb(function () {
console.log('1s ')
sleepByCb(function () {
console.log('2s ')
sleepByCb(function () {
console.log('3s ')
sleepByCb(function () {
console.log('4s ')
sleepByCb(function () {
console.log('5s ')
})
})
})
})
})
console.log(' ')
}
testCb()
testCb()
출력:
1s
2s
3s
4s
5s
총결: 리셋을 사용하는 것은 간단하고 난폭하지만, 리셋을 끼워 넣은 상황에서 그야말로 볼 수 없다
2 promise
코드:
function sleepByPromise() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, 1000)
})
}
function testPromise() {
console.log(' :promise')
sleepByPromise()
.then(function () {
console.log('1s ')
return sleepByPromise()
})
.then(function () {
console.log('2s ')
return sleepByPromise()
})
.then(function () {
console.log('3s ')
return sleepByPromise()
})
.then(function () {
console.log('4s ')
return sleepByPromise()
})
.then(function () {
console.log('5s ')
return sleepByPromise()
})
console.log(' ')
}
testPromise()
출력:
:promise
1s
2s
3s
4s
5s
요약: 이런 체인식 작법은 함수의 절차를 비교적 명확하게 하고 끼워넣는 것을 버렸다.하지만 리셋 자체는 해결되지 않았다.
3 generator
코드:
function sleepByPromise() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, 1000)
})
}
function testPromise() {
console.log(' :promise')
sleepByPromise()
.then(function () {
console.log('1s ')
return sleepByPromise()
})
.then(function () {
console.log('2s ')
return sleepByPromise()
})
.then(function () {
console.log('3s ')
return sleepByPromise()
})
.then(function () {
console.log('4s ')
return sleepByPromise()
})
.then(function () {
console.log('5s ')
return sleepByPromise()
})
console.log(' ')
}
// testPromise()
// 3 generator
function sleepByPromise() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, 1000)
})
}
function* testGenerator() {
console.log(' :generator')
yield sleepByPromise()
console.log('1s ')
yield sleepByPromise()
console.log('2s ')
yield sleepByPromise()
console.log('3s ')
yield sleepByPromise()
console.log('4s ')
yield sleepByPromise()
console.log('5s ')
console.log(' ')
}
let it = testGenerator()
it.next().value
.then(() => {
return it.next().value
})
.then(() => {
return it.next().value
})
.then(() => {
return it.next().value
})
.then(() => {
return it.next().value
})
.then(() => {
return it.next().value
})
출력:
:generator
1s
2s
3s
4s
5s
총괄:generator+promise를 사용하여 비동기화를 동기화(절차성 있음)처럼 하지만 스스로 호출해야 하는 것은 번거롭다.TJ대신의 코쿠를 사용하면 다음 번을 수동으로 반복하지 않아도 된다.
4 generator+co
코드:
const co = require("co");
//
co(testGenerator())
출력:
:generator
1s
2s
3s
4s
5s
5 async/await
코드:
// 5 async/await
function sleepByPromise() {
return new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, 1000)
})
}
async function testAsyncAwait() {
console.log(' :generator')
await sleepByPromise()
console.log('1s ')
await sleepByPromise()
console.log('2s ')
await sleepByPromise()
console.log('3s ')
await sleepByPromise()
console.log('4s ')
await sleepByPromise()
console.log('5s ')
console.log(' ')
}
testAsyncAwait()
출력:
:async/await
1s
2s
3s
4s
5s
요약: 이것은generator+promise의 문법 설탕일 뿐이지만, 원래의 비동기적인 코드를 동기화 형식으로 쓸 수 있다
다음으로 전송:https://juejin.im/post/5bc82518f265da0aaa054536
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.