개발 노트

JavaScript - Promise.all () 본문

JavaScript

JavaScript - Promise.all ()

알 수 없는 사용자 2023. 4. 27. 09:09

Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환합니다.

 

주어진 프로미스 중 하나가 거부하는 경우, 첫 번째로 거절한 프로미스의 이유를 사용해 자신도 거부합니다. 

└ 한가지가 거절하면 all내부의 것들이 다 안돌아도 탈출한다.

 

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

Promise.all(iterable);

 

반환값

  • 매개변수로 주어진 순회 가능한 객체가 비어 있으면 이미 이행한 Promise.
  • 객체에 프로미스가 없으면, 비동기적으로 이행하는 Promise.
  • 그렇지 않은 경우, 대기 중 Promise. 결과로 반환하는 프로미스는 인자의 모든 프로미스가 이행하거나 어떤 프로미스가 거부할 때 (호출 스택이 비는 즉시) 비동기적으로 이행/거부합니다.
    반환하는 프로미스의 이행 값은 매개변수로 주어진 프로미스의 순서와 일치하며, 완료 순서에 영향을 받지 않습니다.

 

이 메서드는 여러 프로미스의 결과를 집계할 때 유용하게 사용할 수 있습니다.

일반적으로 다음 코드를 계속 실행하기 전에 서로 연관된 비동기 작업 여러 개가 모두 이행되어야 하는 경우에 사용됩니다.

 

입력 값으로 들어온 프로미스 중 하나라도 거부 당하면 Promise.all()은 즉시 거부합니다. 이에 비해, Promise.allSettled()가 반환하는 프로미스는 이행/거부 여부에 관계없이 주어진 프로미스가 모두 완료될 때까지 기다립니다. 결과적으로, 주어진 이터러블의 모든 프로미스와 함수의 결과 값을 최종적으로 반환합니다.

 

const getValuesString = async (columnNames, columnTypes, data) => {
  let valuesString;
  try {
    valuesString = await Promise.all(
      columnNames.map(async (name) => {
        let value = data[0][0][name];
        console.log('value', name + ':' + value);
        if (name === 'RegDate' || name === 'regDate') {
          value = 'now()';
          return value;
        }
        if (name === 'issueDate' && value === null) {
          value = 'now()';
          return value;
        }
        if (columnTypes.includes(name)) {
          value = Number(value);
          return value;
        }
        if (value === null) {
          value = ' ';
          return value;
        }
        if (typeof value === 'string') {
          return `'${value}'`;
        } else if (value instanceof Date) {
          return `'${value.toISOString().slice(0, 19).replace('T', ' ')}'`;
        } else {
          return value;
        }
      })
    );
  } catch (error) {
    console.log('error', error);
  }
  return valuesString;
};
    객체가 아니여도 결과값엔 포함된다.

위의 것과 같이 사용하였는데 위의 구문이 포함된 함수를 호출시 값을 불러올 때에 콘솔을 찍어보면 promise :<panding>

이런식으로 나온다.

약속 객체?라고 했던거 같은데 사용한 함수 앞에 await을 써주거나 다른 경우에는 .then, .catch를 사용해주어야 한다.

      let valuesString = await getValuesString(columnNames, columnTypes, data);
함수사용시 예제 - 이런 식으로 await를 사용해야한다.

 

let AuthUser = function(data) {
  return google.login(data.username, data.password).then(token => { return token } )
}

let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }

userToken.then(function(result) {
   console.log(result) // "Some User token"
})
.then 예제
 

Promise - JavaScript | MDN

Promise 객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다.

developer.mozilla.org