NodeJS 비동기 처리

By | 2020년 8월 15일
Table of Contents

NodeJS 비동기 처리

NodeJS 비동기 처리 문제

NodeJS 는 비동기방식으로 처리됩니다. 그러다 보면 의도와는 다른 결과가 나오게 됩니다.

function callbackFunction(callback) {
    setTimeout(callback, 100);
}

for (var i = 0; i < 3; i++) {
    console.log('start for');
    callbackFunction(function() {
        console.log('in callback function');
        console.log(i + 10);
    });
    console.log('end for');
}
start for
end for
start for
end for
start for
end for
in callback function
13
in callback function
13
in callback function
13

Closure

Closure(클로저)를 이용하게 되면 의도한 결과를 얻게됩니다.

function callbackFunction(callback) {
    setTimeout(callback, 100);
}

for (var i = 0; i < 3; i++) {
    console.log('start for');
    (function(v) {
        callbackFunction(function() {
            console.log('in callback function');
            console.log(v + 10);
        })
    })(i);
    console.log('end for');
}
start for
end for
start for
end for
start for
end for
in callback function
10
in callback function
11
in callback function
12

promise

두개 이상의 함수의 실행이 순서를 지켜야 할 경우가 있습니다.

예를들어, 디비에서 데이타를 읽어오고, 읽어온 데이타를 화면에 뿌려야 할 경우 등입니다.

function asyncFunc1(param1, param2) {
    setTimeout(function() {
        console.log('aaa');
    }, 1000);
}

function asyncFunc2(param1, param2) {
    setTimeout(function() {
        console.log('bbb');
    }, 200);
}

asyncFunc1(1, 2);
asyncFunc2(1, 2);

비동기를 실행되게 되면 원하는 결과와 다른 결과를 나타냅니다.

function asyncFunc1(param1, param2) {
    return new Promise(function(resolved, rejected) {
        setTimeout(function() {
            console.log('aaa');
            return resolved(param1, param2);
        }, 1000);
    });
}

function asyncFunc2(param1, param2) {
    return new Promise(function(resolved, rejected) {
        setTimeout(function() {
            console.log('bbb');
            return resolved(param1, param2);
        }, 200);
    });
}

var promise = asyncFunc1(1, 2);
promise.then(asyncFunc2);

promise 를 이용하면 비동기 방식을 유지하면서, 실행순서를 보장할 수 있습니다.

async/await

async/await 를 이용해 좀 더 깔끔히 코드를 정리할 수 있습니다.

function asyncFunc1(param1, param2) {
    return new Promise(function(resolved, rejected) {
        setTimeout(function() {
            console.log('aaa');
            return resolved(param1, param2);
        }, 1000);
    });
}

function asyncFunc2(param1, param2) {
    return new Promise(function(resolved, rejected) {
        setTimeout(function() {
            console.log('bbb');
            return resolved(param1, param2);
        }, 200);
    });
}

const func = async () => {
    await asyncFunc1(1, 2);
    await asyncFunc2(1, 2);
}

func();

답글 남기기