풀기전에는 잠 못잘거같은데
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | function adun(arr, fn) { var len = arr.length, pro = [], p; for( var i = 0; i < len; ++i ) { p = new Promise(function(resolve, reject) { fn(arr[i]); resolve(); }); pro.push(p); } return new Promise(function(resolve, reject) { Promise.all(pro).then(function() { resolve(); }); }) } var numbs = [1, 2, 3, 4, 5, 6, 7, 8]; var cities = ['서울', '인천', '대구', '대전', '광주', '부산', '인천']; var idols = ['소녀시대', 'f(x)', '걸스데이']; adun(numbs, function(num) { console.log(num) }).then(adun(cities, function(city) { console.log(city); })).then(adun(idols, function(idol) { console.log(idol) })).then(function() { alert('exit'); }); | cs |
위 코드는 방금 프로미스 공부하고 만든거
이건 forEach -> forEach -> 같은 형태고...
ㅅㅈ 븅신이 글삭해서 뭘 원하는건지 모르겠네
n길이 배열 m길이 배열에서
for(n) {
for(m)
}
다 끝났을때 말하는건가??
코드에서 콜백을 없애고 싶은거인듯
트와이스가 없넹
솔직하게 말하면 개븅신이 그런코드가 필요할일이없는데 XYProblem 발동한듯
이거랑 약간 다름 재귀여야함
1서울소녀시대 1서울fx 1서울걸스데이 전부 비동기로 만들고 받는거였음
그거 보장해주는게 프로미스임
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise
잠깐만 이쓰셈
만들어드림 컴켜고있음
막상 켰는데 생각이 안남
접근해야하는건 프로미스가 아니라 배열임
생각은 나는데 실력이 미천해서 코드로 못옮기겠음 [p1, p2, p3, p4] 이런 비동기 배열이 있으면
결국엔 [p1, p2, p3, p4]에서 p1은 [pap1, pap2, pap3, pap4]고 p2는 [pbp1, pbp2 ... ] 이런식으로 가기만하면됨
class M { constructor(value) { this.value = value; //[p] } bind(f) { //f -> [p] const temp = this.value.reduce((acc, p) => { acc.push(...f(p)); return acc; }, []); return new M(temp); }}
let t = 0;function g(p) { let z = []; for (let i = 0; i < 3; i++) { z.push(new Promise((res) => setTimeout(_ => console.log(t++), 1000))); } return [p.then(z[0]), p.then(z[1]), p.then(z[2])];}function gg(p) { let z = []; for (let i = 0; i < 2; i++) { z.push(new Promise((res) => setTimeout(_ => console.log(t++), 1500))); } return [p.then(z[0]), p.then(z[1])];}
let p = new Promise((res) => setTimeout(_ => console.log("go"), 2000)); let x = g(p); let m = new M(x); m.bind(gg).bind(g);
마지막에 all로 한번만 검사하게 클래스 손보면 될듯
https://play.golang.org/p/iQ12FVEkmM
매번 all을 써서 새로운 프로미스를 만드는게 아니라 [p1, p2] [pp1, pp2] 이렇게 있으면 [p1.then(pp1), p1.then(pp2), p2.then(pp1), p2.then(pp2)] 이런식으로 나오게 배열만 유지하고 클래스에서 이거에 대한 Promise.all을 호출하게 하면됨
위에서 g랑 gg는 p를 받으면 [p.then(비동기0), p.then(비동기1), ...] 이런식으로 프로미스의 배열을 만드는 함수고
bind를 then처럼 생각해서 계속 묶으면 마지막엔 [모든 프로미스 곱의 조합]이 나오고 여기에 대해서 all한번 호출해주면 끝남
end(f)메서드 추가해서 value프로퍼티가 유지하는 배열에 대해서 Promise.all[this.value].then(f);하면 님이 원하는거 나옴