Node.js 비동기 처리 방식
실행되는 코드가 기다려야 하는 시간이 생긴다는 의미
ex. setTimeOut(), Ajax, setInterval(), query()
→ sql 실행하면 db 프로그램 실행하러 가기 때문에 node.js는 기다려주지 않고 다음 코드를 실행한다.
비동기가 필요 없을 때가 있다. . 지금!
이전 코드들의 시간을 다 기다려준다. 순서를 맞춰서 코드를 실행해준다.
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;
쿼리 순서대로 실행시키기