Javascript
[Promise] 반복문에서 Promise 가 성공일 때만 반복문 진행시키기
★개발일기★
2023. 3. 8. 11:38
반응형
일반적인 반복문에서 async 로 만들어진 함수가 성공했을 때 콜백 함수 같이, 다음 반복문을 실행시키는 로직을
만들어보자.
일반적인 방법으로 사용하면, 앞쪽 Promise 함수가 다 완료된 이후에 다음 Promise 가 실행되리란 보장을 못합니다
여러개가 동시에 실행이 되는 상황이 벌어지죠.
먼저 async 로 만들어진 다음과 같은 함수가 있다고 가정합시다.
export const axiosFunction = async (formData: FormData) => {
const response = await axios.post(
'url',
formData,
{
headers: {
'Content-Type': 'multipart/form-data',
},
},
)
return response
}
처음에 말한 상황은 바로 아래와 같은 상황입니다.
일반적인 반복문에 async 를 호출하면 보장을 할 수 없습니다.
// this is wrong code
for (let i = 0; i < list.length; i++) {
const formData = new FormData()
formData.append('title', list[i])
axiosFunction(formData)
}
순차적으로 실행하고 싶다면 외부함수를 이용해야 합니다.
먼저 빈배열하나를 선언합니다.
반복문에서 그 배열에 함수를 담습니다. ( 호출된 값이 아닌 함수만을 담습니다. )
파라미터로 전달 할 데이터가 있다면 그 또한 배열에 담습니다.
const something: Function[] = []
const somethingParamsData: FormData[] = []
for (let i = 0; i < list.length; i++) {
const formData = new FormData()
formData.append('title', list[i])
axiosFunction(formData)
something.push(setVisitProduct)
somethingParamsData.push(formData)
}
외부함수를 작성합니다.
/**
* 순차실행을 위한 외부함수
* @param params 함수function 배열
* @param data 함수에 받는 파라미터 배열
*/
const callBack = async (params: Function[], data: FormData[]) => {
for (let i = 0; i < params.length; i++) {
await params[i](data[i])
}
}
외부함수를 호출합니다.
const something: Function[] = []
const somethingParamsData: FormData[] = []
for (let i = 0; i < list.length; i++) {
const formData = new FormData()
formData.append('title', list[i])
axiosFunction(formData)
something.push(setVisitProduct)
somethingParamsData.push(formData)
}
callBack(something, somethingParamsData).then(res => {
// 반복문 순차실행이 끝난 후에도 할일이 있다면 여기에서...
})
짜잔! 반복문에서 순차실행을 할 수 있게 되었습니다.
* 중간에 중단해야한다면, Promise 함수에서 각각처리해야합니다.
-> Promise 를 직접써서 함수를 만들었다면 함수 내에서 reject 을 호출하고,
async 로 만들었다면 throw 로 예외를 발생시킵니다.
반응형