π λ¬Έμ μν©
μ¬λ΄ νλ‘μ νΈλ₯Ό μ§ννλ€κ° prop
μΌλ‘ μ λ¬λ°μ ν¨μμ λ°νκ°μ λ°λΌμ
κ·Έ λ€μ νΈμΆλλ μ‘μ νΈλ€λ¬λ₯Ό μ μ΄νκΈ° μν κ²½μ°κ° μκ²Όμ΅λλ€.
μλλ μ΄λ₯Ό κ°λ΅νν μμ μ½λμ λλ€.
interface ComponentProps {
onAction: () => void
onClick: () => unknown
}
export default function Component({ onClose }: ComponentProps) {
// ...
const handleClick = () => {
onClick ? onClick() && onAction() : onAction()
}
return (
<button onClick={handleClick}>try me!</button>
)
}
μ¬κΈ°μ onClick
μ΄ λκΈ° ν¨μλΌλ©΄ μλ¬΄λ° λ¬Έμ κ° λ°μνμ§ μλλ°..
Promise
λ₯Ό λ°νν κ²½μ° onClick()
μ κ²°κ³Όκ° νμ truthy
ν λ¬Έμ κ° λ°μνμ΅λλ€.
π μ΄λ»κ² ν΄κ²°νμ§…? π€
1οΈβ£ async / await μ μ¬μ©νκΈ°
첫λ²μ§Έ λ°©λ²μ μ μ½λμμ handleClick
μ async
ν¨μλ‘ λ°κΎΈκ³
onClick
μ κ²°κ³Όκ°μ await
ν λ€μ κ·Έ λ°νκ°μ μ΄μ©νλ κ²μ
λλ€.
Promise
κ°μ²΄λ λ°νκ°μ΄ Promise
κ° μλλΌλ©΄ μμμ resolved promise
λ‘ λ³ννκΈ° λλ¬Έμ
λλ€.
2οΈβ£ λΉλκΈ° ν¨μ μλ³νκΈ°
λλ²μ§Έ λ°©λ²μ onClick
μ΄ λΉλκΈ° ν¨μμΈμ§ νλ¨νκ³
λ§μ½ λΉλκΈ° ν¨μλΌλ©΄ Promise
κ° pending
μ΄ λλ λκΉμ§ κΈ°λ€λ Έλ€κ° μ΄ μλ΅κ°μ ν΅ν΄μ
λ€μ μ‘μ μ μ€νν μ§ νλ¨νλ λ‘μ§μ λ£λ κ²μ λλ€.
첫λ²μ§Έ λ°©λ²μ΄ κ°λ¨νκ³ κΉλνμ§λ§, μ΄λ² κΈ°νμ λλ²μ§Έ λ°©λ²μ μ΄μ©ν΄μ
μ€μ λ‘ ν΄λΉ ν¨μκ° async function
μΈμ§ νλ¨νλ λ°©λ²μ μμλ³΄κ³ μΆμμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ μλ‘κ² μ μ μλ κ²λ€λ μλ€κ³ μκ°νκΈ° λλ¬Έμ΄μ£ .
π Function constructor λ‘ async ν¨μ μλ³νκΈ°
1οΈβ£ Function & Async Function
JavaScript
μ λͺ¨λ function μ Function
κ°μ²΄μ΄λ©°
async function μ AsyncFunction
μ
λλ€.
ECMAScript λͺ μΈμ λ°λ₯΄λ©΄ AsyncFunction μ Function μ νμ ν΄λμ€λΌκ³ νλ€μ.
2οΈβ£ Function name μΌλ‘ ν¨μ μλ³νκΈ°
κ°κ°μ μμ±μ ν¨μλ name
μ΄λΌλ μμ±μ κ°μ§λλ°,
μ΄λ₯Ό ν΅ν΄μ ν΄λΉ ν¨μμ μ’ λ₯λ₯Ό μλ³ν μ μμ΅λλ€.
const f = () => {}
const asyncF = async () => {}
console.log(f.constructor.name) // β
Function
console.log(asyncF.constructor.name) // β
AsyncFunction
κ·Έλ¬λ©΄ λ€μκ³Ό κ°μ μ½λλ₯Ό μμ±ν μ μκ² λ€μ!
function isAsyncFunction(func) {
return func.constructor.name === 'AsyncFunction'
}
κ·Έλ°λ° μ μ½λλ async
ν€μλλ‘ μμ±λμ§ μμ ν¨μκ° Promise
λ₯Ό λ°νν λ λ¬Έμ κ° μκΉλλ€.
λ€μμ μ΄λ¬ν κ²½μ°μ λν κ°λ¨ μμ μ½λμ λλ€.
const f = () => { return Promise.resolve('is AsyncFunction?') }
console.log(f.constructor.name) // π¨ Function
ν¨μ f
λ λΆλͺ
Promise
λ₯Ό λ°ννκ³ μμ§λ§, async
ν€μλλ‘ μ μΈλμ§ μμκΈ°μ
name
μμ±μ΄ Function
μ΄ λλ κ²μ
λλ€.
π ν¨μμ λ°νκ°μ΄ Promise μΈμ§ μλ³νκΈ°
π‘ instanceof μ°μ°μ νμ©νκΈ°
λ°λΌμ μ΄ κ²½μ°κΉμ§ μ²λ¦¬ν μ μλλ‘ λ°νκ°μ΄ Promise
μΈμ§ νλ¨νλ λ‘μ§μ μΆκ°ν©λλ€.
νΉμ κ°μ΄ Promise
μΈμ§λ λ€μκ³Ό κ°μ΄ instanceof
μ°μ°μλ₯Ό ν΅ν΄ μ μ μμ΅λλ€.
μ΄ μ°μ°μλ μμ±μμ prototype
μμ±μ΄ νΉμ κ°μ²΄μ νλ‘ν νμ
체μ΄λμ μ‘΄μ¬νλμ§ μ²΄ν¬ν©λλ€.
function asyncCallback () {
return Promise.resolve(1)
}
const response = asyncCallback()
console.log(response instanceof Promise) // true
νκ°μ§ μ μν μ μ instanceof
μ°μ°μκ° νΌμ°μ°μλ‘ κ°μ²΄μ μμ±μν¨μλ₯Ό λ°λλ€λ κ²μ
λλ€.
λ°λΌμ instanceof
λ₯Ό μ¬μ©νκΈ° μ μ λ¨Όμ μΈμκ°μ΄ κ°μ²΄μΈμ§λ νμΈμ΄ νμν©λλ€.
μ΄λ₯Ό μν΄ λ€μκ³Ό κ°μ΄ isObject
μ νΈλ¦¬ν° ν¨μλ₯Ό ꡬνν΄μ€λλ€.
function isObject(obj) {
return obj !== null && typeof obj === 'object'
}
μ λ ν¨μλ₯Ό μ‘°ν©νλ©΄ λ€μκ³Ό κ°μ΄ Promise
κ°μ²΄μΈμ§ νλ¨νλ ν¨μλ₯Ό ꡬνν μ μκ² λ€μ!
function isObject(obj: unknown): obj is Object {
return obj !== null && typeof obj === 'object'
}
function isPromise(value: unknown): value is Promise<unknown> {
return isObject(value) && value instanceof Promise
}
π‘ Native Promise κ° κ΅¬νμ΄ μλ νκ²½ (IE) κ³ λ €νκΈ°
λ€λ§ μ λ°©λ²μ ES6 μ΄μμ νκ²½μμ Promise κ°μ²΄λ₯Ό μ¨μ ν μ§μνλ κ²½μ°μλ§ μ¬μ©ν μ μμ΅λλ€.
λ§μ½ IE
μ κ°μ΄ ES5 κ° νμν νκ²½μμλ Promise
λ₯Ό μ¬μ©νκΈ° μν΄μ
bluebird
λ when.js
μ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μλ μλλ°,
μ΄λ¬ν κ²½μ°μλ νΈν κ°λ₯νκΈ° μν΄μ thenable
체ν¬λ₯Ό μ¬μ©νλ λ°©λ²λ μμ΅λλ€.
μ΄λ νΉμ κ°μ²΄μ then
κ³Ό catch
ν¨μκ° κ΅¬νλμ΄μλμ§ νμΈνλ λ°©λ²μ μ΄μ©ν©λλ€.
function isPromise(value: any): value is Promise<any> {
return (
value &&
typeof value.then === 'function' &&
typeof value.catch === 'function'
)
}
π μ΄μ μ ν¨μλ€μ μ‘°ν©ν©λλ€
μμμ μ μν ν¨μλ€μ λͺ¨λ ν©μ³μ λ€μκ³Ό κ°μ΄ νΉμ ν¨μκ° λΉλκΈ° κ°μ λ°ννλμ§ νλ¨ κ°λ₯ν©λλ€.
ν¨μμ λ°νκ°μ΄ Promise
μΈμ§ μκΈ° μν΄μλ λ¨Όμ ν¨μλ₯Ό μ€νν΄λ΄μΌκ² μ£ ?
μΈμλ‘ λ°μ function
μ΄ μ°μ callable
νμ§ νλ¨νκΈ° μν νμΈμ΄ νμνλ©°
μ΄λ₯Ό μν isFunction
ν¨μλ₯Ό ꡬνν΄μ€λλ€.
function isFunction(value: unknown): value is Function {
return typeof value === 'function'
}
λ§μ§λ§μΌλ‘ μ ν¨μλ€μ μ‘°ν©νμ¬ λ€μκ³Ό κ°μ΄ λΉλκΈ° ν¨μ νλ¨ μ νΈλ¦¬ν° ν¨μλ₯Ό ꡬνν©λλ€.
function isAsyncFunction(func: unknown) {
if (!isFunction(func)) {
return false
}
const functionType = func.constructor.name
if (
functionType === 'AsyncFunction' ||
functionType === 'Function' && isPromise(func())
) {
return true
}
return false
}
μ¬κΈ°μ func()
λ₯Ό νΈμΆνμ¬ λ°νκ°μ΄ Promise
κ°μ²΄μΈμ§ νμΈνκ³ μμ΅λλ€.
λΉμ©μ΄ μμ ν¨μλΌλ©΄ μκ΄ μκ² μ§λ§, μκ°μ΄ μ€λ 걸리λ API νΈμΆ λ±
μ¬λ¬ λΉλκΈ° μμ μ΄ μ½νμλ κ²½μ°λΌλ©΄ μκΈ°κ° λ¬λΌμ§κ² μ£ ?
κ·Έλμ νλ‘μ νΈμμλ AsyncFunction
μ 무μ ν¨μμ λ°νκ°λ ν¨κ» μ λ¬νλλ‘ νμ΅λλ€ π
μμμ ꡬνν ν¨μλ₯Ό νμΈν΄λ³΄κΈ° μν΄ νμ©ν ν μ€νΈ μΌμ΄μ€λ λ€μκ³Ό κ°μ΅λλ€.
const testFuncExpression = () => { return 1 }
const testAsyncFuncExpression = async () => { return 1 }
function testFuncDeclaration() { return 1 }
async function testAsyncFuncDeclaration() { return 1 }
const asyncCallbackFunc = () => { return Promise.resolve(1) }
console.log(isAsyncFunction(testFuncExpression)) // false
console.log(isAsyncFunction(testAsyncFuncExpression)) // true
console.log(isAsyncFunction(testFuncDeclaration)) // false
console.log(isAsyncFunction(testAsyncFuncDeclaration)) // true
console.log(isAsyncFunction(asyncCallbackFunc)) // true
const primitives = [1, true, null, undefined, Symbol(1), 'func']
for (const primitive of primitives) {
console.log(isAsyncFunction(primitive)) // false * 6
}
π μ°Έκ³ μλ£
How to Check if a Function is Async in JavaScript | bobbyhadz
AsyncFunction - JavaScript | MDN
How to check if a variable is an object in JavaScript
How to check if an object is a Promise?
'π¨βπ» web.dev > js.ts' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
DOM event.composed (shadow root λ°μΌλ‘ μ΄λ²€νΈ μ νμν€κΈ°) (0) | 2023.05.15 |
---|---|
TypeScript + Jest μ λ ν μ€νΈ μμ±νκΈ° (0) | 2022.11.27 |
[JavaScript] Debounce μ Throttle μ λν΄ μμ보μ (0) | 2022.07.09 |
[TypeScript] enum κ³Ό union type, μΈμ μ¨μΌν κΉ? (2) | 2022.07.09 |
[JavaScript] Array.sort λ μμ μ±μ 보μ₯ν κΉ? (0) | 2022.03.09 |
π¬ λκΈ