【发布时间】:2014-10-18 10:46:06
【问题描述】:
在开发 Cordova 插件时,我找到的所有教程都是这样的:
文件:AwesomePlugin.js
var AwesomePlugin = {
kungfuGripAction = function(target, successCallback, failureCallback) {
return cordova.exec(
successCallback,
failureCallback,
'AwesomePluginClass',
'kungfuGripAction',
[target]
);
}
};
module.exports = AwesomePlugin;
文件: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;
}
文件:clientCode.js
AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) { }, function(err) { });
在上面的代码中,回调只能被调用一次然后被释放。如果您尝试调用回调上下文对象的.success() 或.error() 方法,它将不起作用,您将收到一条日志消息:
Attempted to send a second callback for ID: AwesomePlugin2982699494<BR>W/CordovaPlugin(976) Result was: "Target successfully gripped."
似乎不可能编写带有可重复调用的回调的方法,因为 .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) { });
上面的AwesomePlugin.punchRepeatedly() 将重复执行(可能在单独的线程中)并在每次成功执行时调用function(hits)。如果以事实上的方式实现(使用一次性回调),则必须在回调中使用循环(这很糟糕,因为它是非异步的)或尾部调用 AwesomePlugin.punchRepeatedly()(容易出错)。
在本机代码中实现punchRepeatedly() 以便能够注册一次回调然后重复执行它的正确方法是什么?
【问题讨论】:
标签: java android cordova plugins