2016-09-16 3 views
1

여러 이미지를 다운로드 할 수있는 URL을 얻으려고 시도 중입니다. 그런 다음 내 앱에서 변경 사항을 트리거합니다. 하지만 ... 어떤 이유로 든 이미지 중 하나가 존재하지 않으면 모든 것이 자동으로 실패합니다.Firebase 저장소가 자동으로 실패합니까?

const promises = []; 

snapshot.forEach(childSnapshot => { 
    const child = childSnapshot.val(); 
    const promise = firebase.storage() 
    .ref(child.songImagePath) 
    .getDownloadURL() 
    .catch(err => { 
     console.log('caught', err); 
     return ""; 
    }) 
    .then(imageURL => { 
     return imageURL; 
    }); 

    promises.push(promise); 
}); 

Promise.all(promises) 
    .catch(err => { 
    console.log('caught', err); 
    }) 
    .then(urls => { 
    ...do something with urls array 
    }); 

내가 저장에서 이미지의 위치를 ​​저장하는 내 데이터베이스에 child.songImagePath을 사용하고 있습니다 :

여기에 코드입니다. 모든 이미지의 모든 경로에 이미지가 있으면 모든 것이 완벽하게 작동합니다.

하지만 업로드가 잘못되거나 저장 위치에 이미지가없는 경우 자동으로 실패합니다. 내 catch 화재가 발생하지 않았습니다. 그리고 Promise.all은 해결되지 않습니다.

여기 무슨 일 이니? getDownloadURL에 전화하기 전에 파일의 존재 여부를 확인할 수있는 방법이 있습니까?

EDIT : @mjr은 문서에서 오류 콜백 형식을 약간 다르게 지정했습니다. 이것은 또한 결코 오류를 발생시키지 않는 것 같습니다 :

.then(
    imageURL => { 
     return imageURL; 
    }, 
    err => { 
     console.log('caught', err); 
     return ""; 
    } 
); 
+0

[워드 프로세서] (https://firebase.google.com/docs/storage/web/download-files) 다른 방법이 여기에서 어떻게 작성했는지에 따라 오류를 포매팅합니다. 나는이 방법을 시도하고 무슨 일이 일어나는가 보려고. – mjr

+0

나는 그것을 알아 차렸다. 또한 오류 콜백을 throw하지 않는 것 같습니다. 나는 보여줄 질문을 편집 할 것이다. – nicholas

+0

푸시 대신에 ['Array.prototype.map'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)을 사용하는 것이 더 관용적입니다 'forEach' 내에서 배열에 원소를 넣는 것. – royhowie

답변

1

Firebase Storage JS dev here.

Chrome 및 React Native에서 사소한 변경 사항 [1]을 사용하여 코드를 실행했지만 해당 동작을 보지 못했습니다.

항상 잘못된 파일에 대한 배열에서 빈 문자열을 사용하여 Promise.all이 해결 (실패하지 않음)하는 것을 확인합니다. 이는에 대한 .catch 처리기가 빈 문자열을 반환하기 때문입니다.

추가 문제 해결을 위해

, 그것을 알고 도움이 될 것입니다 :

네트워크에서, 예를 들어 당신이
  • 브라우저/환경과 버전
  • 네트워크 로그를 사용하는 중포 기지 JS 라이브러리의
    • 버전, Chrome의 개발자 도구 패널 또는 기타 브라우저의 패널

    firebase-talk Google 그룹은 개방형 문제 해결을위한 더 나은 장소가 될 수 있습니다. 더 많은 앞뒤로.

    [1] 참고로, 여기 내 코드 :

    const promises = []; 
    
    // Swap out the array to test different scenarios 
    
    // None of the files exist. 
    //const arr = ['nofile1', 'nofile2', 'nofile3']; 
    
    // All of the files exist. 
    const arr = ['legitfile1', 'legitfile2', 'legitfile3']; 
    
    // Some, but not all, of the files exist. 
    //const arr = ['legitfile1', 'nofile2', 'nofile3']; 
    
    arr.forEach(val => { 
      const promise = firebase.storage() 
        .ref(val) 
        .getDownloadURL() 
        .catch(err => { 
         // This runs for nonexistent files 
          console.log('caught', err); 
          return ""; 
        }) 
        .then(imageURL => { 
         // This runs for existing files 
          return imageURL; 
        }); 
    
      promises.push(promise); 
    }); 
    
    Promise.all(promises) 
      .catch(err => { 
        // This never runs 
        console.log('caught', err); 
      }) 
      .then(urls => { 
        // This always runs 
        console.log('urls', urls); 
      }); 
    
  • 관련 문제