javascript - 如何等待React Native Image Picker回调函数响应?

标签 javascript react-native asynchronous google-cloud-firestore react-native-image-picker

我想做一个函数,将从react-native-image-picker中挑选的照片上传到firestore,然后返回上传图像的URL值。照片上传成功,我可以在控制台中打印下载 URL,问题是当我尝试在函数中返回 URL 时,它是未定义的。我尝试使用异步函数在返回其值之前等待图像选择器响应完成,但它仍然返回 {"_U": 0, "_V": 0, "_W": null, "_X": null} .

uploadImg: async () =>{
        await ImagePicker.launchImageLibrary({ mediaType: 'photo' }, response => {
            if (response.error) {
                alert('Something went wrong');
            } else {
                try {
                    const { path, uri } = response;
                    const fileSource = Platform.OS === 'android' ? uri : path;
                    const { fileName } = response;
                    const storageRef = storage().ref(fileName);
                    
                    storageRef.putFile(fileSource).on('state_changed', snapshot => {
                        switch (snapshot.state) {
                            case 'running':
                                setImageURI(null);
                                break;
                            case 'success':
                                snapshot.ref.getDownloadURL().then(downloadURL => {
                                    setImageURI(downloadURL);
                                    //This console log works, and actually prints the correct url
                                    console.log(`Download URL ${downloadURL}`); 
                                });
                                break;
                            default:
                                break;
                        }
                        
                    });
                } catch (error) {
                    console.log(error)
                }
            }
        }); 
        return imageURI;
    }

我很确定问题不在于状态、上传图片或图像选择器响应。这可能是异步函数的错误使用。

最佳答案

这是因为您在 firebase 调用完成执行之前从函数返回。我对您的代码进行了一些更新,以便该函数可以等待 firebase 响应。

uploadToFirebase: ( fileName, filesource )=>new Promise((resolve, reject)=>{
  const storageRef = storage().ref(fileName);
  storageRef.putFile(fileSource).on('state_changed', snapshot => {
    switch (snapshot.state) {
      case 'running':
        setImageURI(null);
        break;
      case 'success':
        snapshot.ref.getDownloadURL().then(downloadURL => {
          setImageURI(downloadURL);
          //This console log works, and actually prints the correct url
          console.log(`Download URL ${downloadURL}`); 
        });
        break;
      default:
        break;
    }
    resolve();
  });
})
uploadImg: async () =>{
  let response = await ImagePicker.launchImageLibraryAsync({ mediaType: 'photo' });
  if (response.error) {
    alert('Something went wrong');
  } else {
    const { path, uri } = response;
    const fileSource = Platform.OS === 'android' ? uri : path;
    const { fileName } = response;
    await uploadToFirebase(fileName, fileSource)
  }
  return imageURI;
}

关于javascript - 如何等待React Native Image Picker回调函数响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65837081/

相关文章:

javascript - 页面刷新后保留表格排序结果?

javascript - 从条件渲染的 JSX 内部调用类方法

react-native - 为什么 "react-native link some-native-module"是彩票?

java - Android 应用程序因 firebase-auth (react-native) 崩溃

javascript - 异步函数后如何检索结果?

python - 如何在 celery 中回调但不阻止进程

JavaScript 对象不改变图像

javascript - 如何在 Reactjs 中将 props 传递给子组件

javascript - 如何确定 JS 文件是否与 AMD 兼容?

JavaScript 无法处理 HTML 文件?