콜백 헬이라고 불리는 지저분한 자바스크립 코드의 해결책

 - 프로미스 : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체

 - Then을 붙이면 결과를 반환합니다.

 - 실행이 완료되지 않았으면 완료된 후에 Then 내부 함수가 실행됩니다.

 - Resolve(성공리턴값) -> then 으로 연결

 - Reject(실패리턴값) -> catch로 연결

 - Finally 부분은 무조건 실행됩니다.

 

const condition = true; // true 면 resolve, false면 reject
const promise = new Promise((resolve, reject) => {
  if (condition) {
    resolve("성공");
  } else {
    reject("실패");
  }
});

//다른 코드가 들어갈 수 있음
promise
  .then((message) => {
    console.log(message); // 성공(resolve)한 경우 실행
  })
  .catch((error) => {
    console.error(error);
  });

 

결과값

D:\code\node\lecture2>node test1.js
성공

 

promise.all(배열) : 여러 개의 프로미스를 동시에 실행

 - 하나라도 실패하면 catch로 감

 - allSettled로 실패한 것만 추려낼 수 있음

const promise1 = Promise.resolve("성공1");
const promise2 = Promise.resolve("성공2");
Promise.all([promise1, promise2])
  .then((result) => {
    console.log(result); // ['성공1','성공2'];
  })
  .catch((error) => {
    console.error(error);
  });

 

결과값

D:\code\node\lecture2>node test1.js
[ '성공1', '성공2' ]

 

Async/awit 으로 한 번 더 축약 가능

function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = "gildong";
      return user.save();
    })
    .then((user) => {
      return Users.findOne({ gender: "m" });
    })
    .then((user) => {
      //생략
    });
}

 

Async function 의 도입

 - 변수 = await 프로미스; 인 경우 프로미스가 resolve 된 값이 변수에 저장

 - 변수 await 값; 인 경우 그 값이 변수에 저장

async function findAndSaveUser(Users){
  let user = await Users.findOne({});
  user.name = 'gildong';
  user = await user.save();
  user = await Users.findOne({gender : 'm'});
  //생략
}

 

for await ( 변수 of 프로미스배열)

 - resolve된 프로미스가 변수에 담겨 나옴

 - await을 사용하기 때문에 async 함수 안에서 해야함

const promise1 = Promise.resolve("성공1");
const promise2 = Promise.resolve("성공2");
(async () => {
  for await (promise of [promise1, promise2]) {
    console.log(promise);
  }
})();

 

결과값

D:\code\node\lecture2>node test1.js
성공1
성공2

 

 

 화살표 함수는 기존 함수 문법을 완벽하게 대체할 수는 없습니다.

기존 함수로 사용을 해야만 하는 때도 있습니다.

// add1, add2, add3, add4 모두 동일한 함수
function add1(x, y) {
  return x + y;
}

const add2 = (x, y) => {
  return x + y;
};

// add3과 같이 간결하게 변경이 가능하지만 헷갈릴 수 있어서 add4로 주로 씁니다.
const add3 = (x, y) => x + y;
const add4 = (x, y) => (x + y);

 

// not1을 not2로 변경 가능, 매개변수가 1개일 때는 괄호도 생략 가능
function not1(x){
  return !x;
}

const not2 = x => !x;

 

// 객체를 바로 return 할 때는 (괄호)를 꼭 작성해야 합니다.
const obj = (x,y) =>({x,y});

 

기존 function 문법이 안 사라진 이유는 기존 this 때문입니다.

function 에서는 this를 따로 갖는데 화살표 함수는 부모의 this를 물러 받습니다.

 

var relationship1 = {
  name: "gildong",
  friends: ["a", "b", "c"],
  logFriends: function () {
    var that = this; // relationship1을 가리키는 this를 that에 저장
    this.friends.forEach(function (friend) {
      console.log(that.name, friend);
    });
  },
};
relationship1.logFriends();

 

결과화면 

D:\code\node\lecture2>node test1.js
gildong a
gildong b
gildong c

 

화살표 함수가 기존 function(){}을 대체하는 것은 아닙니다.(this가 달라짐)

- logFriedns 메서드의 this 값에 주목

-  forEach의 function의 this와 logFriends의 this는 다름

- that 이라는 중간 변수를 이용해서 logFriends의 this를 전달

 

this를 사용해야 할 때는 function 을 사용하고

this를 사용하지 않을 때는 화살표 함수를 사용하는 것을 추천합니다.

 

'Javascript > Node' 카테고리의 다른 글

프로미스 promise async await  (0) 2024.11.02
템플릿 문자열 객체 리터럴  (0) 2024.10.31
var const let 자바스크립트 변수 상수  (0) 2024.10.30
Node.js 다운로드 설치 최신버전 22버전  (0) 2024.10.29
서버 노드  (0) 2024.10.28
let year = 2024;
let result = "올해는" + year + "년입니다.";
console.log(result);

 

위와 같이 코딩을 하면 결과는 아래와 같습니다.

올해는2024년입니다.

 

띄어쓰기가 안 되었기 때문에 아래와 같이 수정을 해야 합니다.

let year = 2024;
let result = "올해는 " + year + "년 입니다.";
console.log(result);

결과는 아래와 같습니다. 

올해는 2024년 입니다.

 

const result2 = `올해는 ${year}년 입니다.`;
console.log(result2);

최신 문법에서는 바뀌어서 위와 같이 사용 가능합니다.

변수를 ${} 로 감싸주면 됩니다.

띄어쓰기 할 때도  보기 좋게 바뀌었습니다.

``를 빽틱 문자열 , 템플릿 문자열이라고 부릅니다. 

 

객체 리터럴

>> 훨씬 간결한 문법으로 객체 리터럴 표현 가능

  - 객체의 메서드에 :function을 붙이지 않아도 됩니다.

  - { sayNode : sayNode } 와 같은 것을 { sayNode }로 축약 가능합니다.

const sayNode = function () {
  console.log("Node");
};

const es = "ES";

const newObject = {
  sayJS() {
    console.log("JS");
  },
  sayNode,
  [es + 6]: "Fantastic",
};

newObject.sayNode(); // 실행결과 : Node
newObject.sayJS(); // 실행결과 : JS
console.log(newObject.ES6); // 실행결과 : Fantastic

 

+ Recent posts