Promise.all 에서 reject 에 대한 처리 방법

2496 단어 Promise.allreject
어제 작은 파충 류 를 써 서 axios.all 로 여러 페이지 를 동시에 요청 할 때 국내 네트워크 의 원인 은 쉽게 시간 을 초과 한 후에 reject 되 었 습 니 다.불 계 resolve 는 바람 직 하지 않 습 니 다.그리고'재발 실패 요청'기능 을 실현 할 수 있다 고 생각 했 습 니 다.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 에 대한 처리 방법 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기