https://ko.javascript.info/promise-chaining
Promise 는 두가지 콜백함수를 갖는다
1. 성공햇을때 실행되는 리졸브
2. 실패햇을떄 리젝트
미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)을 반환하는 것
프라미스를 활용한 함수들
promise
.then(성공리턴값)
.catch(실패리턴값)
.finally() 끝나면무조건실행
콜백이런 패턴이 복잡해서 프로미스 탄생
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
펑션에 매스를 넣은 것이 실행 끝난 후 펑션() 즉 콜백함수가 나중에 실행
즉 비동기(순서대로)로 하게끔 콜백함수를 이용한 것
doHomework('math', function() {
alert('Finished my homework');
});
//‘Starting my math homework'
//'Finished my homework'
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
function alertFinished(){
alert('Finished my homework');
}
두홈워크함수에 매스를 넣은 걸 실행 끝난 후
콜백함수 얼럿피니쉬드를 실행
즉 위와 같은 결과
doHomework('math', alertFinished);
//‘Starting my math homework'
//'Finished my homework'
//promise
//producer
function delayP(ms){ //리졸브 리젝트 콜백함수두개 리졸브는 성공햇을때실행되는 콜백 리젝은 실패햇을떄
return new Promise((resolve,reject)=> {
try {
setTimeout(()=>{
resolve("성공");
},ms); // ms 시간만큼 타임아웃 걸림, 타임아웃 때 성공을 출력
}
catch(e){
reject("실패");
};
});
};
//소비자 consumer
delayP(1000) //()안 만큼 타임아웃걸림
.then(console.log) //리졸브에해당 성공을 val로 받아서 출력
/* .then((val)=>{ //같은코드
console.log(val);
}); */
.catch(console.log);
//.catch(err=>{console.log(err)}) //같은코드 실패를 err로 받아서 출력
//딜레이피를 여러번 쓰고 싶을 때
//지정한 시간마다 타임아웃을 연속적으로 건다
function delayP(index,ms){
return new Promise((resolve,reject)=> {
setTimeout(()=>{
resolve(index+"성공");
},ms);
});
}
//1초마다 한번씩
//비동기적을 동기적으로 한 것 동기적:위에서아래로차례로
// 첫 1,1000이 펑션으로 들어가면 아래 value로 성공이 들어가서 출력되고
// 두번째 2,1000이 펑션으로 가서 아래 value로 출력이되고
// 세번째 3,1000이 펑션으로 들어가서 나온 value가 .then(console.log); 에서 출력된다
delayP(1,1000)
.then(value=>{
console.log(value); //resolve성공을 출력한 후 다시 delayP를 리턴
return delayP(2,1000);
})
.then(value=>{
console.log(value);
return delayP(3,1000);
})
.then(console.log);
const fs = require("fs");
//순서 보장 방법 2가지
// CMD실행 // a b c txt파일을 순서대로 읽는다
fs.readFile("../07.File/tmp/a.txt","utf-8",(err,bufA)=>{
console.log(bufA)
fs.readFile("../07.File/tmp/b.txt", "utf-8", (err,bufB)=>{
console.log(bufB);
fs.readFile("../07.File/tmp/c.txt", "utf-8", (err,bufC)=>{
console.log(bufC);
});
});
});
//이거대신 아래서 프라미스 덴덴덴으로 순서를 잘 볼 수 잇게
const fs = require("fs");
function readFilePromise(path){
return new Promise((resolve,reject)=>{
fs.readFile(path,"utf-8",(err,data)=>{
if (err)
reject(err);
else
resolve(data);
});
});
};
//cmd실행
readFilePromise("../07.File/tmp/a.txt")
.then(val=>{
console.log(val);
return readFilePromise("../07.File/tmp/b.txt");})
.then(val=>{
console.log(val);
return readFilePromise("../07.File/tmp/c.txt");})
.then(console.log);