Promise.all 에서 reject 에 대한 처리 방법
2496 단어 Promise.allreject
Promise.all(requestPromises).then(...).catch(...)
모든 requestPromises 가 resolve 일 때 then 방법 에 들 어가 모든 결 과 를 하나의 배열 로 되 돌려 줍 니 다.한 가지 만 실패 하면 catch 에 들어간다.하나의 요청 에서 catch 방법 을 정의 하면 Promise.all 의 catch 방법 에 들 어가 지 않 습 니 다.따라서 하나의 catch 에서 실패 한 promise 를 list 에 넣 고 요청 이 완료 되면 실패 한 요청 을 요청 할 수 있 습 니 다.
let failedList = []
function getDataById (id) { //
return new Promise(function (resolve, reject) {
getResponse(id, resolve, reject)
}).catch(e => {
failedList.push(arguments.callee(id)) // , , promise failedList
})
}
function getResponse (id, resolve, reject) { //
setTimeout(() => {
if (Math.random() > 0.8) resolve({id, msg: 'ok'})
else reject({id, msg: 'error'})
}, 1000)
}
const RequestList = [getDataById(1), getDataById(2), getDataById(3)]
fetchData(RequestList)
let counter = 1 //
let maxRequestTimes = 5 // , , - -
let result = [] //
function fetchData (requestList) { //
Promise.all(requestList).then(resolve => {
result = result.concat(resolve.filter(i => i)) // filter true , getDataById catch ( ), resolve undefined,
let failedLength = failedList.length
if (failedLength > 0 && counter < maxRequestTimes) { // , , , log
console.log(` ${counter} , ${RequestList.length - failedLength} , ${failedLength} , ${++counter} ...`)
fetchData(failedList)
failedList = [] // failedList, 。 , getDataById failedList 。
} else { // , 。 result 。
console.log(` , ${counter} , ${RequestList.length - failedLength} , ${failedLength}
`, result)
counter = 1
}
}).catch(e => {
console.log(e)
})
}
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Promise.all 에서 reject 에 대한 처리 방법 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Promise.all 깊이 이해출력 결 과 를 통 해 되 돌아 오 는 배열 의 데 이 터 는 모두 undefined 임 을 알 수 있 습 니 다.우 리 는 이 원인 을 찾 아야 한다.그것 은 왜 화살표 함 수 를 사용 해 야 하 는 지 찾 은 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.