코드스피츠73 part6
generator, promise, async/await
generator
breaking block
const infinity=(function*(){
let i = 0;
while(true)
yield i++;
})();
console.log(infinity.next());
....
console.log(infinity.next());
time slicing manual
const looper =(n, f, slice = 3)=>{
let limit = 0, i = 0;
const runner=_=>{
while(i < n){
if(limit++ < slice) f(i++);
else{
limit = 0;
requestAnimationFrame(runner);
break;
}
}
};
requestAnimationFrame(runner);
};
looper(12, console.log);
위에 로직을 generator 변경
const loop = function*(n, f, slice = 3)=>{
let limit = 0, i = 0;
while(i < n){
if(limit++ < slice) f(i++);
else{
limit = 0;
yleid;
}
}
};
const executor =iter =>{
const runner =_=>{
iter.next();
requestAnimationFrame(runner);
};
requestAnimationFrame(runner);
};
executor(loop(10, console.log));
로직과 알고리즘의 분리가 가능
generator + async + executor
yleid는 값을 받아들이거나 출력할수 있다.
const profile = function*(end, next, r){
const userid = yield $.post('member.php', {r}, next);
let added = yield $.post('detail.php', {userid}, next);
added = added.split(",");
end({userid, nick:added[0], thumb:added[1]});
};
const executor = (end, gene, ...arg)=>{
const next =v=> iter.next(v);
const iter = gene(end, next,...arg);
iter.next();
};
executor(console.log, profile, 123);
위에 로직은 콜백지옥을 탈출 목표
비동기를 동기식으로 보이게 하기 위해
promise
passive async control
콜백을 보낼수는 있지만 언제올지는 모른다.
콜백은 순서에 관계가 있게 개발해야 되나?(순서 없는쪽으로 가야된다.)
$.post(url, data, e=>{
//언제올까
});
왜언제가중요한가?
let result;
$.post(url1, data1, v=>{
result = v;
});
$.post(url2, data2, v=>{
result.nick = v.nick;
report(result);
});
콜백 제어는 순서를 모르는것이 죄악 ㅜㅜ
active async control
프라미스는 then을 호출해야 결과를 얻는다.
let result;
const promise = new Promise(r=>$.post(url1, data1, r));
promise.then(v=>{result = v;});
const promise1 = new Promise(r=>$.post(url1, data1, r));
const promise2 = new Promise(r=>$.post(url2, data2, r));
promise1.then(result=>{
promise2.then(v=>{
result.nick = v.nick;
report(result);
});
});
generator + promise
const profile = function*(end, r){
const userid = yield new Promise(res=>$.post('member.php', {r}, res));
let added = yield new Promise(res=>$.post('detail.php', {userid}, res));
added = added.split(",");
end({userid, nick:added[0], thumb:added[1]});
};
const executor = (gene, end, ...arg)=>{
const iter = gene(end, ...arg);
const next = ({value, done}) =>{
if(!done)
value.then(v=>next(iter.next(v)));
};
next(iter.next());
};
executor(profile, console.log, 123);
async await
await promise = sync
const profile = async function(end, r){
const userid = await new Promise(res=>$.post('member.php', {r}, res));
let added = await new Promise(res=>$.post('detail.php', {userid}, res));
added = added.split(",");
end({userid, nick:added[0], thumb:added[1]});
};
profile(console.log, 123);