React Native里原生模块调用后JS端收不到回调怎么办?

欧阳建梗 阅读 28

我在写一个自定义的原生模块,Android那边用Promise.resolve返回了数据,但JS这边调用后完全没反应,也不报错。试过加Log发现原生代码确实执行了,但JS的.then()根本没进。

原生方法是这么写的:

@ReactMethod
public void getData(Promise promise) {
    try {
        String result = "hello from native";
        promise.resolve(result);
    } catch (Exception e) {
        promise.reject("ERR", e);
    }
}

JS端调用就是普通的MyModule.getData().then(...),但then里的代码从来不跑,这是哪儿出问题了?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
W″艺嘉
这个问题我之前也踩过坑,八成是模块注册或者JS端获取模块的方式有问题。

先说最常见的一个坑,JS端获取模块的方式要写对:

import { NativeModules } from 'react-native';
const { MyModule } = NativeModules;
// 或者用这种方式
const MyModule = NativeModules.MyModule;


如果你写成了NativeModules.MyModule.getData直接调用,可能会拿到undefined。

然后检查一下你的Package有没有在MainApplication里注册,这个容易忘。在MainApplication.javagetPackages()方法里,要把你的模块Package加进去:

@Override
protected List getPackages() {
return Arrays.asList(
new MainReactPackage(),
new MyModulePackage() // 别忘了这个
);
}


再有一个坑是方法名的问题,RN会把Java方法名的第一个字母转成小写,所以你的getData在JS端调用的时候应该是MyModule.getData(),这个你写对了应该没问题。

我之前还遇到过一种情况,就是原生模块的类没有正确继承ReactContextBaseJavaModule,或者getName()返回的名字和JS端用的不一致,这个也要核对一下。

如果这些都对,试试在JS端加个catch看看有没有错误被吞掉了:

MyModule.getData()
.then(data => console.log('收到数据:', data))
.catch(err => console.log('出错了:', err));


大概率是模块注册的问题,你排查一下这几个地方。
点赞 2
2026-03-01 09:02