javascript - 在运行被调用的函数之前触发一个函数运行

标签 javascript reactjs react-native expo

我有 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>
  );

最佳答案

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

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

到:

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

关于javascript - 在运行被调用的函数之前触发一个函数运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65256528/

相关文章:

java - 如何使用 AJAX 响应修改 Spring mvc 项目中的现有 url?

javascript - prop `store` 在react-redux Provider 中如何工作?

javascript - React Router 链接右键单击不起作用

javascript - 在前台显示通知 react 原生 firebase v6

java - Swift 中的静态类

javascript - 如何创建包含变量输入的函数的变量

javascript - 过滤方法 - Angular.JS

ios - 应用程序在未从 Xcode 运行时自动关闭

javascript - Node.js 不能要求同一目录中的 .js 文件

reactjs - 在React中,html标签中的key属性的作用是什么