我有 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/