let promise = new Promise(function(resolve, reject) {
// executor 실행
}
1 . then
기본 문법
promise.then(
function(result) { /* result를 다룸 */}
function(error) { /*error다룸 */}
);
then의 첫번째 인자는 promise 성공시 (resolve함수 호출됐을 때), 실행결과를 받고,
두번째 인자는 promise 실패시 (reject함수 호출시), 에러를 받고 사용된다.
그리고 then메소드는 promise를 반환한다.
catch
에러만 핸들링하고 싶을 경우.
then과 동일하게 promise.catch(error)
뒤에 붙혀 사용하면 된다.
Promise를 반환한다.
catch(f1) === then(null, f1)
과 동일하다.
하지만 catch를 사용하는게 가독성이 더 좋고, 비동기에서 발생하는 에러뿐만아니라 then내부에서 생기는 에러까지 처리할 수 있다.
Ex) .then(f1, f2) 에서 만약 f1에서 에러가 발생하면 f2는 그 에러를 처리불가.
finally
결과에 상관없이 마무리가 필요할때 promise.filnally(f)
를 사용할 수 있다.
finally(f) 와 then(f, f)가 유사하지만 다른점은
finally는 인자가 없다.( 그래서 promise 결과를 알 수 없음)
다음 핸들러에 결과와 에러를 자동으로 전달.
여러개의 비동기처리를 할 때, 콜백으로만 처리하게 되면, 가독성이 떨어지고, 콜백헬이 발생하기 쉽다.
프로미스 후속 처리 메소드들을 체이닝해서 프로미스를 연결하여 사용할 수 있다.
(프로미스 후속 처리 메소드들의 반환값이 프로미스이기 때문에 promise chaining이 가능)
new Promise(function(resolve, reject) {
SetTimeout( () => resolve(1), 1000);
}.then(function(result) {
alert(result) // 1
return result * 2
}). then(function(result) {
alert(result) // 2
return result * 2
}) then(function(result) {
alert(result) // 4
return result * 2
})
위와 같이 사용된다.
Return에 프로미스를 반환해도 resolve의 결과값이 then으로 넘어간다.(비동기실행될경우)
let promise = Promise.all([. . .promises. . .])
Microtask Queue에 의해서 JS Engine내의 stack이 비었을 때(stack내부 작업들이 다 실행되고 난 후에) Microtask Queue내부에 있는 작업들이 실행됨. (프로미스의 .then/.catch/.finally 내 코드들).
async function f() {return 1;}. f().then(alert); // 1