이 블로그 검색

2018년 10월 15일 월요일

Promise 의 이해

Promise는 JavaScript의 비동기 처리를 위해 탄생했기 때문에 Java나 C++ 등의 동기형 객체지향 프로그래머들이 이해하기 여간 까다로운 개념이 아님.

자바 스크립트는 함수를 인자로 받을 수 있다. 이 점을 잘 인식해야 한다. 여기서 모든 헛갈림이 시작된다.

아래는 인자를 함수로 받는 함수의 정의(선언)
Ex)
function getData(callbackFunc) {
  $.get('url 주소/products/1', function (response) {
if(response){
callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
}
  });
}

이렇게 인자를 함수로 받은 함수를 사용(호출) 할 때 인자로 전달된 함수를 정의(선언) 해서 쓴다.

getData(function(tableData){
console.log(tableData);
});

즉, callbackFunc = function(tableData){
console.log(tableData);
} 이 되는 셈.

프로미스를 쓰면, 이렇게 함수를 정의한다.
function getData() {
return new Promise(function(resolve, reject){
$.get('url 주소/products/1', function(response){
if(response){
resolve(response);
}
reject(new Error("Request is failed"));
});
});
}

즉 promise 라는 객체를 생성 시키는 방법은 function(resolve, reject)함수를 생성자 인자로 던져 주면 된다.
여기서 promise를 return 하는 이유는 return을 함으로써 getData() 함수 밖에 쓸 수(즉 콜백 지옥을 벗어날 수)있기 때문이다.

그리고 promise 의 생성자 인자로 던져진 함수 내부에 시간이 걸리는(즉, 비동기 처리에 원인이 되는- 볼드체 부분) 코드를 넣으면 된다.
그리고 나서 resolve() 함수에 비동기 처리된 결과 값(response)를 넘겨준다.

getData().then(function(data){
console.log(data);
})

그러면 위와 같이 then() 안에 인자로서 resolve(reponse)를 실제 어떤 동작을 하는지 정의(선언) 해주면 된다.
즉, resolve(reponse)는 맨 위의 callbackFunc(response)와 똑같은 역할을 한다.

 getData().then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
});

에러처리는 위와 같이 catch()를 이용한다.
간단히 말해, then에 들어가는 인자는 resolve()를 함수로서 구체화 하는 코드가 들어가고,
catch에 들어가는 인자는 reject()를 함수로서 구체화 하는 코드가 들어가면 된다.


2018년 6월 22일 금요일

ionic 데이터를 객체 형태로 뷰로 넘길 때 발생하는 undefined(null)

ionic에서 viewDidLoad() 에서 데이터를 set 했는데, View단에서 그 데이터를 못 가져오는 경우가 있다.
이런 경우는 View 단에 Data를 넘길때 객체(Object) 형태로 넘겨서, 뷰단에서 그 값을 빼서(fetch) 표시하는 경우 자주 발생한다. 뷰단에 넘기는 데이터는 string이나 number 처럼 primitive 형태의 데이터를 넘기는 것이 안전하다. 코드단에서 전부 가공을 마치고 말 그대로 뷰(View)단에서는 최종적으로 유저에게 보여지(viewed)는 data만을 넘긴다. 

2017년 12월 12일 화요일

전역 변수를 사용했을시 직면할 수 있는 버그
 => 데이터가 리프레쉬가 안되는 현상.
 변수의 데이터가 계속 쌓이면서 초기화가 안되는 문제가 있을때 자신이 전역변수를 사용하고 있지 않는지 체크해 볼 필요가 있다.

2017년 12월 1일 금요일

JSON Doc 에서 Array나 Object를 못 가져올 때 (Unable to get access Array or Object from JSON in Javascript)

답은 JSON.stringfy() 로 doc을 읽어 들인 후 ==> JSON.parse()로 다시 바꿔줘야 한다.
Express 등에서 디비에서 떨궈서 받은 Json 데이터 안에 Array나 객체에 접근 못하는 경우가 종종 있다. 콘솔이나 로그에는 명확히 찍히기 때문에 매우 당황 스럽다.
 이는 JavaScript 의 JSON 이 우리가 흔히 말하는 JSON 포맷과 다르기 때문에 발생한다. 즉 자바스크립 버젼의 JSON을 JSON 인터페이스 포맷으로 바꿔야 한다. 그 후 다시 JSON.parse()로 바꿔 줌.
방법은
let originalJson = JSON.stringfy(javaScriptJson)
let parsedJson = JSON.parse(originalJson);

2017년 11월 28일 화요일

ionic2 Android build and Release

우선 프로젝트 루트 폴더의 config.xml 파일에서 widget id와 버전(version)을 체크하고 변경해 준다. (이게 같으면 나중에 다 해놓구 플레이 스토어에 안올라감... ;;)
그리고 해당 프로젝트 루트 폴더에서 CLI로 다음과 같이 입력
$ ionic cordova build --release android
그러면 android-relase-unsigned.apk 가 나온다.
(이 apk 파일은 프로젝트폴더\platforms\android\build\outputs\apk\ 에 생성되니 헤메지 말자)
이 녀석을 Sign해 줘야한다.
따라서 Keytool 이라는 명령어(JDK)를 이용해서 사인을 할 key를 만들어줘야 한다. (이미 key가 있으면 이 과정은 생략하고 jarsigner를 이용해 sign을 하면 된다.)
keytool은 JDK 명령어 이므로, Java path(C:\Program Files\Java\jdk1.8.0_152\bin)를 시스템 환경 변수에 잡아 줘야 정신건강에 이롭다.
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
위의 명령어를 이용해서 사인키를 만들었으면, my-release-key.keystore 라는 파일이 현재의 폴더에 생성될거임
그럼 역시 JDK 명령어인 jarsigner를 이용해서 다음과 같이 사인해줌.(즉 키가 이미 있음위의 keytool 과정은 생략해도 됨)
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk alias_name
당연히 alias_name에 바꾸고 싶은 이름을 넣어야 함. 근데 주의할건 이 alias_name 이 keytool 명령어에서 사용했던 alias_name 이랑 일치해야 함. 
(이때 가끔 아래와 같이 암호를 제대로 넣었는데오 저런 재수없는 에러가 나올수 있는데, 이건 해당 폴더에 쓰기 권한 설정이 없어서 그런거임. (회사컴등으로 작업할때 나올 수 있음) 폴더에 권한을 주면 됨.
Enter Passphrase for keystore:
jarsigner: unable to create: android-release-unsigned.apk.sig)

그러면 그냥 똑같은 파일이름으로 android-release-unsigned.apk 가 생성되는데 사실 이건 unsigned 가 아니고 sign 된 거임. 이걸 zipalign 이라는 Android SDK 빌드툴로 압축해줘야 함. (당연히 안드로이드도 환경 변수로 잡아야 정신건강에 이로움 - 안드로이드 빌드 툴은 보통 ~Users\AppData\Local\Android\Sdk\build-tools\ 이라는 깊고 깊은 곳에 있음.)
zipalign -v 4 android-release-unsigned.apk HelloWorld.apk
이렇게 해주면 최종 Signed Release apk 가 생성됨
(참고: 위의 과정을 c:\signing 와 같은 정해진 폴더에 android-release-unsigned.apk, my-release-key.keystore 같은 파일들을 때려넣고, 자바와 안드로이드 패쓰를 잡고 해당 폴더에서 작업을 하는게 편함)
플레이스토어에서 올리는 법


2016년 7월 4일 월요일

mean stack setting

요 페이지가 베스트 임..

https://www.npmjs.com/package/generator-mean-stack

2016년 6월 1일 수요일

Restful put 에서 파라메터로 객체를 넘겨야 한다.

말 그대로 Restful put() 에서 파라메터로 객체를 넘겨야 한다.
primative 값(int 등)으로 넘기면 400 에러(Not found)를 밷는다..
이것 때문에 많이 헤멤...;;