티스토리 뷰

promise.all()

주어진 모든 프로미스가 이행하거나, 한 프로미스가 거부될 때까지 대기하는 새로운 프로미스를 반환한다.

반환하는 프로미스가 이행한다면, 매개변수로 제공한 프로미스 각각의 이행 값을 모두 모아놓은 배열로 이행한다. 배열 요소의 순서는 매개변수에 지정한 프로미스의 순서를 유지한다.

반환하는 프로미스가 거부된다면, 매개변수의 프로미스 중 거부된 첫 프로미스의 사유를 그대로 사용한다.

 

순회 가능한 객체를 인자로 받아 객체에 주어진 모든 프로미스를 이행한 후 결과를 반환한다. 주어진 프로미스 중 하나라도 reject 될 경우 reject 된 값을 반환한다.

매개변수 : 순회 가능한(iterable) 객체

반환 값 : promise

 

전달받은 비동기 작업 여러 개가 모두 완료될 때까지 기다렸다 다음 동작을 하려 할 때 사용한다.

 

MDN promise

MDN promise.all()

 

promise.all()은 순서 보장이 될까?

// 실행 코드 1 - promise 안에서 배열에 push 하고 출력했을 때
const seconds = [1000, 2000, 3000, 4000, 5000, 200, 100];
const idArr = [1, 2, 3, 4, 5, 6, 7];

const promiseArr = [];
const pushArr = [];

const makePromise = (id, second) => {
	return new Promise((res, rej)=>{setTimeout(()=>{
		res(pushArr.push(id))
  }, second)})
}

for (let i = idArr.length - 1; i > -1; i--) {
	promiseArr.push(makePromise(idArr[i], seconds[i]));
}


Promise.all(promiseArr).then(()=>{
  console.log(pushArr);
});

// 실행결과
// [7, 6, 1, 2, 3, 4, 5]
// 실행 코드 2 - promise resolve 데이터를 출력했을 때
const seconds = [1000, 2000, 3000, 4000, 5000, 200, 100];
const idArr = [1, 2, 3, 4, 5, 6, 7];

const promiseArr = [];
const pushArr = [];

const makePromise = (id, second) => {
	return new Promise((res, rej)=>{setTimeout(()=>{
		res(id);
  }, second)})
}

for (let i = idArr.length - 1; i > -1; i--) {
	promiseArr.push(makePromise(idArr[i], seconds[i]));
}


Promise.all(promiseArr).then((resArr)=>{
  console.log(resArr);
});

// 실행 결과
// [7, 6, 5, 4, 3, 2, 1]

promise 객체에서 push를 실행하도록 한 pushArr은 실행된 순서대로 데이터가 담겨있고

promise 객체가 resolve 되어 반환하는 resArr은 promise를 실행한 순서대로 데이터가 담겨있다.

 

promise.all()에 넘겨준 promise들은 동작은 비동기로 실행되어 순서가 보장되지 않지만 resolve된 반환 데이터를 사용하면 순서를 보장할 수 있다.

 

참고 1

참고 2

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함