[javascript] Promise

eunn·2019년 11월 15일
1
post-custom-banner

먼저 알아야 할 부분, 비동기 처리??

javascript의 특성 중 하나인 비동기 처리는 특정 코드의 연산이 끝날 때까지 기다리지 않아요. 특정 코드가 돌아가는 중에 다음 코드를 먼저 실행해버립니다.

Promise가 뭐죠?

자바스크립트 비동기 처리에 사용되는 객체로, fetch와 같이 순차적으로 data를 가져 온 후 처리 해야할 때 사용합니다. data를 다 가져오지도 않았는데 다음 코드가 실행 되어 버리면 오류가 나거나 빈 화면이 나오기 때문이죠.

어떻게 써야할까요?

저는 이번에 Trello 서버를 만들면서 route 부분과 DB에서 할 일을 따로 분리해 작성하면서, Promise 객체를 직접 만들어 사용했던 것을 예로 들어보겠습니다.
비밀번호 암호화를 시키기 위해 crypto를 사용했는데, crypto에서는 promise를 지원하지 않기 때문에 직접 만들어주거나 'crypto.pbkdf2Sync'를 사용해야 오류가 나지 않고 원하는 값을 route 부분에 넘겨줄 수 있었습니다.
처음에 promise를 사용하지 않았을 때에는 성공과 실패 여부는 알 수 있었지만 route 부분에서는 성공과 실패 여부를 받지 못하고 'undefined' 라고만 나왔거든요 ㅠㅠ
하지만 아래의 코드처럼 promise를 사용하니 문제가 해결되었어요!

return new Promise(resolve => {
          crypto.pbkdf2(
            body.password,
            searchUser.dataValues.salt,
            100000,
            64,
            "sha512",
            async (err, key) => {
              if (key.toString("base64") === searchUser.dataValues.password) {
                exactPassword = true;
                await models.user.destroy({
                  where: { email: userEmail.email }
                });
                resolve("success");
              }
              if (!exactPassword) {
                resolve("failure");
              }
            }
          );
        });
        ```

### resolve 와 rejection
new Promise()는 보통 콜백 함수의 인자로 resolve와 reject 두개를 받고, resolve는 error 처리를 할 때 사용하는데, 저는 위의 코드에서 resolve만 받아서 성공, 실패 문구를 보내주도록 처리했어요. 

#### 참고자료
Promise 관련 더 자세한 사항은 아래 사이트를 참고하시면 좋을 것 같아요 :)
https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
crypto는 아래 사이트를 참고했습니다!
https://victorydntmd.tistory.com/33
profile
사람-컴퓨터와 소통하고 싶은 병아리 개발자입니다🐥
post-custom-banner

0개의 댓글