You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:23:17