React Native中Kotlin重写函数如何resolve Promise?原生回调关联React
解决方法
核心问题是要把initOpenPath方法接收的Promise暂存起来,等原生库的onInit回调触发时,再调用它的resolve方法完成异步响应。具体实现步骤如下:
在
NewLibModule类中添加成员变量,用于暂存Promise实例:private var initPromise: Promise? = null修改
initOpenPath方法,将传入的Promise赋值给成员变量,同时处理重复调用的情况:@ReactMethod fun initOpenPath(promise: Promise) { // 如果已有未完成的初始化Promise,先拒绝旧请求 initPromise?.let { it.reject("INIT_IN_PROGRESS", "OpenPath初始化已在进行中") } initPromise = promise OpenpathMobileAccessCore.getInstance().init(application, this) }在
onInit回调中调用暂存的Promise的resolve方法,完成后清空变量避免内存泄漏:override fun onInit() { initPromise?.let { it.resolve("OpenPath初始化成功") // 可替换为实际需要返回给JS的初始化数据 initPromise = null } }(可选)如果原生库提供初始化失败的回调(比如
onInitFailure),对应处理Promise的reject:override fun onInitFailure(errorCode: Int, errorMessage: String) { initPromise?.let { it.reject("INIT_FAILED", "初始化失败:$errorMessage(错误码:$errorCode)") initPromise = null } }
修改后的完整代码:
class NewLibModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), OpenpathMobileAccessCore.OpenpathEventHandler { override fun getName(): String { return "NewLib" } // 新增:暂存初始化用的Promise private var initPromise: Promise? = null @ReactMethod fun multiply(a: Int, b: Int, promise: Promise) { promise.resolve(a * b) } @ReactMethod fun initOpenPath(promise: Promise) { // 处理重复调用 initPromise?.let { it.reject("INIT_IN_PROGRESS", "OpenPath初始化已在进行中") } initPromise = promise OpenpathMobileAccessCore.getInstance().init(application, this) } override fun onInit() { // 触发Promise resolve initPromise?.let { it.resolve("OpenPath初始化成功") initPromise = null } } // 可选:处理初始化失败的回调 override fun onInitFailure(errorCode: Int, errorMessage: String) { initPromise?.let { it.reject("INIT_FAILED", "初始化失败:$errorMessage(错误码:$errorCode)") initPromise = null } } }
这样JS端调用NewLib.initOpenPath()后,会等待原生库的onInit回调触发,Promise随后会resolve并将结果返回给JS。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

