在Vision Camera(非Expo)的useFrameProcessor中调用异步函数报错求助
非Expo环境下Vision Camera useFrameProcessor调用异步函数的解决方案
错误原因分析
1. runAsync 调用失败
你传递参数的顺序错误,且内联匿名worklet函数无法被正确识别为可共享的worklet,导致报错“Regular javascript function '' cannot be shared”。
2. runOnJS 调用失败
直接在runOnJS内联匿名函数会导致worklet环境无法正确处理该函数,触发“Property '_WORKLET' doesn't exist”错误。
正确实现方式
首先确保已安装并配置 react-native-worklets-core(Vision Camera的Frame Processor依赖该库,非Expo环境需手动执行pod install或gradle同步)。
方案一:用runOnJS执行JS主线程的异步操作
适合需要访问React状态、调用原生异步API等场景:
import { useFrameProcessor } from 'react-native-vision-camera'; import { runOnJS } from 'react-native-worklets-core'; // 定义JS主线程执行的普通函数(不要加'worklet'标记) const handleAsyncTask = async () => { console.log("inside run on js"); // 这里可添加异步逻辑,比如API请求、状态更新等 // await fetch('https://example.com/api'); }; const CameraComponent = () => { const frameProcessor = useFrameProcessor((frame) => { 'worklet' console.log("I'm running synchronously at 60 FPS!"); // 用runOnJS包裹函数并执行,如需传参可在括号内添加 runOnJS(handleAsyncTask)(); }, [handleAsyncTask]); // 必须将函数加入依赖数组 // ...其余组件代码 };
方案二:用runAsync在Worklet线程执行异步Worklet
适合不需要JS主线程的异步操作(如图像处理、TensorFlow Lite推理):
import { useFrameProcessor } from 'react-native-vision-camera'; import { runAsync } from 'react-native-worklets-core'; // 定义带'worklet'标记的异步函数 const asyncWorkletTask = async (frame) => { 'worklet' console.log("I'm running asynchronously, possibly at a lower FPS rate!"); // 这里添加Worklet环境支持的异步逻辑 }; const CameraComponent = () => { const frameProcessor = useFrameProcessor((frame) => { 'worklet' console.log("I'm running synchronously at 60 FPS!"); // 传递Worklet函数和参数 runAsync(asyncWorkletTask, frame); }, [asyncWorkletTask]); // 加入依赖数组 // ...其余组件代码 };
内容的提问来源于stack exchange,提问作者Provat
相关产品推荐
相关产品推荐

