blog

배열 루프 요청의 Promise.all 애플리케이션 시나리오 - 라인 아래로 이동하기 전에 데이터에 해당하는 모든 항목을 비동기적으로 가져옵니다.

문제 설명 최근에 이상한 요구가 발생하여 여러분과 공유합니다. 백엔드가 배열을 반환한다고 가정하면 배열 데이터는 다음과 같습니다. 여기서는 각 항목의 나이를 직접 반환하지 않습니다...

May 1, 2025 · 3 min. read
シェア

문제 설명

최근에 여러분과 공유하고 싶은 이상한 요구 사항을 발견했습니다.

백엔드에서 다음 데이터가 포함된 배열을 반환한다고 가정해 보겠습니다:

let arr = [
 {
 name: '손오공',
 id: '111',
 age: null
 },
 {
 name: '피기백',
 id: '222',
 age: null
 },
 {
 name: ' ,
 id: '444',
 age: null
 },
 {
 name: '백룡마',
 id: '555',
 age: null
 },
]
  • 각 항목의 연령은 여기에서 직접 반환되지 않습니다.
  • 각 항목의 연령은 프런트엔드에서 이름을 매개변수로 사용하여 다른 인터페이스를 호출한 다음 특정 사람의 연령을 요청해야 합니다.
  • 어떤 친구는 연령 필드에 있는 배열 List에 직접 할당된 SQL 문을 통해 연령을 확인하지 않냐고 물었습니다.
  • 일반적으로는 필수 항목이지만 특정 상황에서는 다음과 같습니다.
  • 연령 필드 데이터를 가져오기 위해 특별히 다른 요청을 보낼 수 있는 것은 사실입니다.

그래서:

  • 이 배열을 얻은 후에는 요청을 루프로 전송해야 합니다.
  • 이름과 해당 나이를 가져옵니다.

인터페이스 함수

function getAge(name) {
 return new Promise((resolve, reject) => {
 axios.get(`/api/getAge?name=${name}`).then((res) => {
 let age = res.data.data.age
 console.log(`  ${name} 약속의 시대 ${age}`);
 resolve(age)
 }).catch((err) => {
 reject(err)
 })
 })
}

예시:

{
 "code": "0",
 "message": " ,
 "data": {
 "age": 500 // 88
 }
}

Promise.all 사용하기 맵 루프 사용

  • Promise.all은 배열을 수신해야 하므로 여기서는 forEach 루프를 사용할 수 없습니다.
  • 그리고 forEach는 물건을 반환하지 않습니다.
  • 따라서 Promise.all에서 사용할 수 있는 구토의 배열을 반환하는 맵을 사용하는 것이 적절합니다.
  • 다음을 참조하세요:
async function getAgeFn(arr) {
 // 루프에서 배열에 값 할당하기
 let newArr = arr.map(async (item) => {
 item.age = await getAge(item.name) // 연령 할당 대기
 return item
 })
 // Promise배열 받기
 await Promise.all(newArr)
 // 실행이 완료된 후 계속 진행하기
 console.log('최종 처리된 배열 결과: ', arr);
}
getAgeFn(arr)

전체 코드

과제를 붙여넣어 다음을 보여줄 수 있습니다.

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>반복되는 비동기 요청</title>
 <script src="https://..net/ajax/libs/axios/..0/.js"></script>
</head>
<body>
 <script>
 let arr = [
 {
 name: '손오공',
 id: '111',
 age: null
 },
 {
 name: '피기백',
 id: '222',
 age: null
 },
 {
 name: '백룡마',
 id: '555',
 age: null
 },
 ]
 function getAge(name) {
 return new Promise((resolve, reject) => {
 axios.get(`http://.work/api/getAge?name=${name}`).then((res) => {
 let age = res.data.data.age
 console.log(`  ${name} 약속의 시대 ${age}`);
 resolve(age)
 }).catch((err) => {
 reject(err)
 })
 })
 }
 async function getAgeFn(arr) {
 // 루프에서 배열에 값 할당하기
 let newArr = arr.map(async (item) => {
 item.age = await getAge(item.name)
 return item
 })
 // Promise배열 받기
 await Promise.all(newArr)
 // 실행이 완료된 후 계속 진행하기
 console.log('최종 처리된 배열 결과: ', arr);
 }
 getAgeFn(arr)
 </script>
</body>
</html>
Read next