https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

 

//-------------------------------------
* await 키워드
    - async 속성이 부여된 함수 내부 에서만 사용가능

 


* async 함수
    - await 없이 호출하면 바로 다음 코드가 실행됨(비동기 동작)
    - async 함수 내부 코드는 동기로 실행됨

 


//-------------------------------------
// 비동기 함수 - Promise 사용
function asf1() {
    return new Promise(resolve => {
        resolve('asf1-end');
    });
    // 동일 : return Promise.resolve('resolved')
}

// 비동기 함수 - aync 사용
async function asf2() {
    return 'asf2-end';
    // 동일 : return Promise.resolve('asf2-end').then(() => undefined)
}

//-------------------------------------
// 비동기 함수 호출 - 일반 함수
function asyncCall1() {
    console.log('asyncCall1 - start')
    let ret;
    ret = asf1().then((ret) => { console.log(ret) });
    ret = asf2().then((ret) => { console.log(ret) });
    //ret = await asf1(); //에러    
    console.log('asyncCall1 - end')
}

// 비동기 함수 호출 - async 함수
async function asyncCall2() {
    console.log('asyncCall2 - start')
    let ret;
    ret = asf1().then((ret) => { console.log(ret) });
    ret = asf2().then((ret) => { console.log(ret) });
    ret = await asf1();
    console.log(ret)
    ret = await asf2();
    console.log(ret)
    console.log('asyncCall2 - end')
}

 

//-----------------------------------------------

< 일반 동기 함수를 비동기 함수로 바꾸는 함수 >

// sync -> async
Function.prototype.applyAsync = function (..._args) {
    return new Promise((resolve, reject) => {
        try {
            var function_context = this;
            setTimeout(function () {
                var val = function_context.apply(undefined, _args);
                resolve(val);
            }, 0);
        } catch (e) {
            reject('error');
        }
    });
}

function add(a,b){
    return a+b;
}

let ret = await add.applyAsync( 1,2 );

 

반응형
Posted by codens