Node.js 비동기

방울·2024년 6월 2일
0

Node.js 비동기

Node.js 비동기 처리 방식

  • 비동기 발생

실행되는 코드가 기다려야 하는 시간이 생긴다는 의미

ex. setTimeOut(), Ajax, setInterval(), query()

→ sql 실행하면 db 프로그램 실행하러 가기 때문에 node.js는 기다려주지 않고 다음 코드를 실행한다.

  • 비동기 처리

비동기가 필요 없을 때가 있다. . 지금!

이전 코드들의 시간을 다 기다려준다. 순서를 맞춰서 코드를 실행해준다.

  1. 콜백 함수: 할 일 다 하고, 이거 실행해줘(= 순서 맞춰서 이걸 뒤에 실행해달라고)
  2. promise (resolve, reject)
  3. then & catch
  4. async & await

Promise “객체” : 약속을 지키는 친구

let promise = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve('완료'), 3000);
});
promise.then(
	function(result){
	console.log(result)
	}, 
	function(error){
	}
);
let promise = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve('완료'), 3000);
}).then(
	function(result){
		console.log(result);
		return result+"!!!!!";
	},
	function(error){}
).then(
	function(result){
		console.log(result);
		return result+"!!!!!";
	},
	function(error){}
).then(
	function(result){
		console.log(result);
		return result+"!!!!!";
	},
	function(error){}
)
;

promise는 매개변수로 함수를 받음

excutor? 지킬 약속(할 일)

성공적으로 하면 resolve(결과), 실패하면 reject(에러)

일을 다 하면 무조건 콜백함수 resolve 또는 reject 둘 중 하나는 호출

then()은 기본 메소드, promise가 일 다 하고 호출해야하는 함수

chaining

async & await

promise 객체를 좀 더 쉽고 편하게 사용 문법

즉 비동기 처리가 쉽다

async 함수

function f(){} // 일반 함수
async function f() {} // async 함수
async function f() {
	return 7; // promise 객체를 반환 중
}

async function f() {
	return Promise.resolve(7);
}

f().then(
	function(result){
	 console.log("promise resolve: ",result);
	},
	function(error){
	 console.log("promise resolve: ",error);
	}
);

async 함수는 무조건 promise 객체를 반환

만약 반환값이 promise가 아니면, promise.resolve()로 감싼다.

await는 async 함수 안에서만 동작!

await이 promise 객체 .then() 이 메소드를 좀 더 쉽게 사용할 수 있는 방법

async의 두 번째 기능

Promise 객체가 일이 끝날 때까지 기다릴 수 있는 공간을 제공한다.

async function(){
	let promise = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve("완료"), 3000);
});

	let result=await promise;
	console.log(result);
}

f();

async 함수 안에서 promise 객체 기다림

async function(){
	let promise1 = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve("첫번째 쿼리"), 3000);
});

	let result1 = await promise1;
	console.log(result1);
	
		let promise2 = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve("두번째 쿼리 with"+result1), 3000);
});

	let result2 = await promise2;
	console.log(result2);

	let promise2 = new Promise(function(resolve, reject) {
	setTimeout(()=> resolve("세번째 쿼리 with"+result2), 3000);
});
	let result3 = await promise3;
	console.log(result3);
}

f();

const orderItems=(req,res)=>{
    const { items, delivery, totalQuantity, totalPrice, userId, firstBookTitle} = req.body;

    let delivery_id;
    let order_id;

    let sql=`INSERT INTO delivery(address, receiver, contact) VALUES(?,?,?)`
    let values=[delivery.address, delivery.receiver, delivery.contact];

    conn.query(sql, values,
        (err,results)=>{
            if(err){
                console.log(err)
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            delivery_id=results.insertId;
            console.log("results.insertId",results.insertId)
            console.log("conn.query - delivery_id",delivery_id)
        }
    )

    console.log("out - delivery_id",delivery_id);

    sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
            VALUES(?, ?, ?, ?, ?)`;
    values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id]
        conn.query(sql, values,
        (err,results)=>{
            if(err){
                console.log(err)
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            order_id=results.insertId;
        }
    )
    sql=`INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?`
    values=[];
    items.forEach((item)=>{
        values.push([order_id, item.book_id, item.quantity])
        }
    )
    conn.query(sql, [values],
        (err,results)=>{
            if(err){
                console.log(err)
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            return res.status(StatusCodes.OK).json(results);
        }
    )
}
const mariadb = require('mysql2/promise')

const connection = async () => {
    const conn = await mariadb.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'Bookshop',
        dateStrings: true
    });

    return conn;
}

module.exports=connection;

Promise Wrappers | Quickstart

쿼리 순서대로 실행시키기

profile
방울방울

0개의 댓글