Cordova:如何编写可以反复调用Javascript回调的本机插件?

n.a*_*ing 10 java plugins android cordova

在开发Cordova插件时,我发现的所有教程都是这样的:

文件:AwesomePlugin.js

var AwesomePlugin = {
  kungfuGripAction = function(target, successCallback, failureCallback) {
    return cordova.exec(
      successCallback,
      failureCallback,
      'AwesomePluginClass',
      'kungfuGripAction',
      [target]
    );
  }
};

module.exports = AwesomePlugin;
Run Code Online (Sandbox Code Playgroud)

文件:AwesomePluginClass.java

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (ACTION_KUNGFU_GRIP.equals(action)) {
        JSONObject target = args.getJSONObject(0);
        if (gripTarget(target)) {
            callbackContext.success("Target successfully gripped.");
            return true;
        } else {
            callbackContext.error("Could not grip target.");
            return false;
        }
    }

    Log.d(LOG_TAG, "INVALID ACTION! " + action);
    callbackContext.error("Invalid action: " + action);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

文件:clientCode.js

AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) { }, function(err) { });
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,回调只能被调用一次然后被处理掉.如果您尝试调用回调上下文对象的.success()or .error()方法,它将无法工作,您将收到一条日志消息:

Attempted to send a second callback for ID: AwesomePlugin2982699494<BR>W/CordovaPlugin(976) Result was: "Target successfully gripped."
Run Code Online (Sandbox Code Playgroud)

似乎不可能编写一个带有回调的方法,该方法可以被重复调用,.success()并且.error()是唯一记录的从本机插件代码中调用回调的方法.虽然这主要是我们想要的,但有时我们希望让插件重复执行回调.例如:

AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) {
  // After successful grip, punch repeatedly and update life meter.
  AwesomePlugin.punchRepeatedly(cobraEnemy, function(hits) {
    updateLifeMeter(cobraEnemy, hits);
  }, function(err) { });
}, function(err) { });
Run Code Online (Sandbox Code Playgroud)

AwesomePlugin.punchRepeatedly()上面将重复执行(可能在一个单独的线程中)并function(hits)在每次成功执行时调用.如果以事实上的方式实现(使用一次性回调),则必须使用循环(因为它是非异步的,这是错误的)或AwesomePlugin.punchRepeatedly()在回调中使用尾调用(容易出错).

punchRepeatedly()在本机代码中实现的正确方法是什么,以便能够一次注册回调然后重复执行?

小智 18

我想,你可以使用一个pluginResultkeepCallback属性设置为true.

PluginResult result = new PluginResult(PluginResult.Status.OK, "YOUR_MESSAGE");
// PluginResult result = new PluginResult(PluginResult.Status.ERROR, "YOUR_ERROR_MESSAGE");
result.setKeepCallback(true);
callbackContext.sendPluginResult(result);
Run Code Online (Sandbox Code Playgroud)

您应该能够以这种方式多次调用回调.