2분만에 JS 면접/약속
15530 단어 careertypescriptjavascriptbeginners
약속이란 무엇입니까?
빠른 답변:
작업의 현재 상태와 값을 나타내는 객체입니다. Promise에는 세 가지 상태(보류, 성공, 실패)가 있습니다.
더 긴 답변:
기본적으로 Promise 이면의 아이디어는 이해하기 매우 쉽습니다. 일부 계산이 완료될 때만 해결되는 컨테이너일 뿐입니다. 그게 다야
직접 구현해보면 이해가 쉬울 것 같아요.
class MyPromise {
dataHandlers = []
errorHandler = []
finalHandlers = []
constructor(func) {
// Apply handlers one by one and initialize every following handler with the previouses result
let onResolve = data => this.dataHandlers.reduce(
(acc, onData) => onData(acc),
data
)
// Just call every onReject
let onReject = error => this.errorHandler.reduce(
(_, onError) => onError(error),
undefined
)
// Just call every onFinal
let onFinal = () => this.finalHandlers.reduce(
(_, onFinal) => onFinal(),
undefined
)
// We need to set timeout, so our function
// executed after we set .then, .catch, and .finally
setTimeout(() => {
try {
func(onResolve, onReject)
} catch (error) {
onReject(error)
} finally {
onFinal()
}
}, 0)
}
then(onData, onError) {
if (onData) { this.dataHandlers.push(onData) }
if (onError) { this.errorHandler.push(onError) }
return this
}
catch(onError) {
return this.then(undefined, onError)
}
finally(onFinal) {
if (onFinal) { this.finalHandlers.push(onFinal) }
return this
}
}
테스트하자!
let dataPromise = new MyPromise((resolve, reject) => resolve(2))
dataPromise
.then(res => res + 2)
.then(res => res * 2)
.then(res => console.log(res)) // 8
.finally(() => console.log('Finally!')) // Finally!
.finally(() => console.log('Finally (1)!')) // Finally (1)!
let rejectPromise = new MyPromise((resolve, reject) => reject(2))
rejectPromise
.then(res => res + 2)
.then(res => res * 2)
.then(res => console.log(res))
.catch(error => console.error(error)) // 2
.finally(() => console.log('Finally!')) // Finally!
let throwErrorPromise = new MyPromise((resolve, reject) => { throw new Error('hello') })
throwErrorPromise
.then(res => res + 2)
.then(res => res * 2)
.then(res => console.log(res))
.catch(error => console.error(error)) // hello
.finally(() => console.log('Finally!')) // Finally
// This one will produce two errors instead of one.
// Can you come up with the fix?
let doubleErrorPromise = new MyPromise((resolve, reject) => reject('first'))
doubleErrorPromise
.catch(error => { console.error(error); throw 'second' })
// 'first'
// 'second'
// Uncaught 'second'
// This is how it should work
let fixedDoubleErrorPromise = new Promise((resolve, reject) => reject('first'))
fixedDoubleErrorPromise
.catch(error => { console.error(error); throw 'second' })
// 'first'
// Uncaught 'second'
실제 응용 프로그램:
때론 좀 더 사용하기 편하다async/await syntax
때로는 Promise.all과 같은 Promise 도우미 기능이 필요합니다.
자원:
MDN/Promise
다른 게시물:
Btw, 나는 여기에 더 재미있는 것들을 게시할 것입니다. 친구하자 👋
Reference
이 문제에 관하여(2분만에 JS 면접/약속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kozlovzxc/js-interview-in-2-minutes-promise-4fhl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)