【问题标题】:trigger a function to run before running the function that's called在运行被调用的函数之前触发函数运行
【发布时间】:2020-12-11 18:12:37
【问题描述】:

我有 3 个功能。一个拍照,一个压缩图片,一个上传图片。

按下按钮拍照(这工作正常) 按下另一个按钮来上传图片,但首先它运行压缩图像,然后上传它,但我遇到了ReadableNativeMap cannot be cast to java.lang.String 的错误,这对我有很大帮助。我没有正确传递值吗?

//Take picture
  const takePicture = async () => {
    if (cameraRef.current) {
      const options = { quality: 1, base64: true, skipProcessing: true };
      const result = await cameraRef.current.takePictureAsync(options);
      setImageResult(result.uri);
    }
  };

  //compression image
  const compressimagestuff = async (uncompressedImage) => {
    const manipResult = ImageManipulator.manipulateAsync(
        uncompressedImage,
        { compress: 0.3, format: ImageManipulator.SaveFormat.JPEG }
      );
    return manipResult.url;
  };


  // uploading it to firebase
  const uploadImageAsync = async (uncompressedImage) => {
    let compressedImageUrl = compressimagestuff(uncompressedImage);
    const blob = await new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.onload = function () {
          resolve(xhr.response);
        };
        xhr.onerror = function (e) {
          console.log(e);
          reject(new TypeError('Network request failed'));
        };
        xhr.responseType = 'blob';
      xhr.open('GET', compressedImageUrl, true);
      xhr.send(null);
        
    });

    const ref = firebase
      .storage()
      // the file that it will get saved to
      .ref('Front/')
      // giving it a unique name
      .child(await uuid.v4())
    const snapshot = await ref.put(blob);
    blob.close();
    return await snapshot.ref.getDownloadURL();
  };
  

上传照片的按钮

  const uploadPreviewButton = () => (
    <TouchableOpacity disabled={wasPressed} onPress={() => { uploadImageAsync(imageResult); setWasPressed(true); }} style={[styles.uploadButton, wasPressed ? { backgroundColor: 'red'} : {} ]}>
        <Icon ...>
    </TouchableOpacity>
  );

【问题讨论】:

    标签: javascript reactjs react-native expo


    【解决方案1】:

    compressimagestuff 是一个异步函数,但您不必等待它。改变这个:

    const uploadImageAsync = async (uncompressedImage) => {
        let compressedImageUrl = compressimagestuff(uncompressedImage);
    

    到:

    const uploadImageAsync = async (uncompressedImage) => {
        let compressedImageUrl = await compressimagestuff(uncompressedImage);
                              // ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多