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

React Native中Kotlin重写函数如何resolve Promise?原生回调关联React

解决方法

核心问题是要把initOpenPath方法接收的Promise暂存起来,等原生库的onInit回调触发时,再调用它的resolve方法完成异步响应。具体实现步骤如下:

  1. 在NewLibModule类中添加成员变量,用于暂存Promise实例:

    private var initPromise: Promise? = null
    
  2. 修改initOpenPath方法,将传入的Promise赋值给成员变量,同时处理重复调用的情况:

    @ReactMethod
    fun initOpenPath(promise: Promise) {
        // 如果已有未完成的初始化Promise,先拒绝旧请求
        initPromise?.let {
            it.reject("INIT_IN_PROGRESS", "OpenPath初始化已在进行中")
        }
        initPromise = promise
        OpenpathMobileAccessCore.getInstance().init(application, this)
    }
    
  3. 在onInit回调中调用暂存的Promise的resolve方法,完成后清空变量避免内存泄漏:

    override fun onInit() {
        initPromise?.let {
            it.resolve("OpenPath初始化成功") // 可替换为实际需要返回给JS的初始化数据
            initPromise = null
        }
    }
    
  4. (可选)如果原生库提供初始化失败的回调(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:35:25