我无法多次执行cordova回调

kgsdhlau  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(167)

我开发了一个ionic-cordova项目。我需要多次执行cordova回调。
以下是我的组件代码:

let data =JSON.parse(JSON.stringify(this.someOptions)) 
    this.customService.TestFunction(data).then(response => {
      console.log(response);
    })
      .catch(ex => {
       // console.log(ex)
      })
  }

这是我的CustomService

TestFunction(arg1: any): Promise<any> {
        var temp = cordova(this, "TestFunction", { callbackStyle: "object" }, [arg1]);
        return temp
    }

下面是js代码

exports.TestFunction = function (arg0, success, error) {
    exec(success, error, 'SomeCordovaPlugin', 'TestFunction', [arg0]);
};

下面是Android的Java代码

public class SomeCordovaPlugin extends CordovaPlugin {

  private CallbackContext testCallbackContext;

  @Override
  public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
       if (action.equals("TestFunction")) {
           this.TestFunction(args, callbackContext);
           return true;
       }
       return false;
  }

  private void TestFunction(JSONArray args, CallbackContext callbackContext) {
     testCallbackContext=callbackContext;
     if (args != null) {
       try {
           for(int i=0;i\<7;i++){
                 PluginResult pluginResult = new PluginResult(PluginResult.Status.OK ,testCallbackContext.getCallbackId());
                 pluginResult.setKeepCallback(true); // keep callback
                 testCallbackContext.sendPluginResult(pluginResult);  
            }
          } catch (Exception ex) {
                 testCallbackContext.error("An error occured:" + ex);
                }
     }
  }

}

我想多次调用cordova exec。pluginResult.setKeepCallback(true)对我不起作用。我正在使用ionic 6和cordova 11。如何多次调用cordova exec?

pwuypxnk

pwuypxnk1#

如果我理解你的问题是正确的,你有一个自定义的cordova插件,你从你的js端调用。然后你想从你的插件返回结果到js世界多次,而不是一次。
问题是插件调用的生命周期是通过调用sendPluginResult()来完成的
我已经解决了这个问题,不使用sendPluginResult()将返回值传输到JS,而是直接通过WebView调用JS函数:

**1.**在JS中设置一个自定义函数,该函数将从您的插件中调用,并在自定义插件的对象上显示结果值,如:

cordova.plugins.<pluginPackage>.<CustomPlugin>.<CustomCallbackFunction> = (data) => {
 //your JS side processing of data returned from your plugin more than once
}

使用和的值

**2.**将callbackContext持久化在自定义插件中,以最终完成调用,就像您已经通过调用sendPluginResult()完成的那样
**3.**在调用插件函数时,不要调用sendPluginResult(),而是直接提示webview处理JS代码,在此您调用了之前在1.定义的回调函数webView.sendJavascript("cordova.plugins.<pluginPackage>.<CustomPlugin>.<CustomCallbackFunction>('" + <your payload as JSON string> + "')")(Kotlin代码)
**4.**最后,当您完成多次呼叫回呼时,请在持续的callbackContext状态OK上呼叫sendPluginResult(),以完成插件呼叫。

相关问题