6

我构建了一个非常简单的PhoneGap插件来开始测试我将在 Android 上构建一些本机操作的方式。

JavaScript:

 function callNativePlugin() {
            cordova.exec(nativePluginResultHandler, nativePluginErrorHandler, "Database", "saveAdvertencia", [ 1, "TesteAdv" ]);
        }

    function nativePluginResultHandler(result) {
        alert("SUCCESS: \r\n" + result);
    }

    function nativePluginErrorHandler(error) {
        alert("ERROR: \r\n" + error);
    }

爪哇:

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (action.equals("saveAdvertencia")) {
        advertenciaDS = new AdvertenciaDS(cordova.getActivity());
        callbackContext.sendPluginResult(new PluginResult(Status.OK, new JSONArray("test")));
        return true;
    }
    return false;
}

我需要的是一种以相同方法从操作中检索结果的方法。当您无法真正控制何时调用它们时,始终处理 3 种方法(1 执行操作。1 定义成功操作。1 定义错误操作)是非常复杂的,因为PhoneGap动作完成后调用它们。

如果我需要从 Android Native 数据库中检索一些数据:

  1. 在 JavaScript 中调用“cordova.exec”。
  2. PhoneGap 会调用你的插件。
  3. 您的插件将返回 2 件事:PhoneGap 的布尔值,定义它一切是否按预期工作。将传递给成功方法的数据。
  4. 这对我来说是棘手的部分。如果成功与否,您必须创建 2 个您无法控制何时调用它们的方法,因为 PhoneGap 将决定这一点。我该如何改变?
4

3 回答 3

5

我使用这种模式对插件提供的函数只有一个回调:

function callNativePlugin(callback) {
   cordova.exec(function(result) {
       callback(null, result);
   }, function(result) {
       callback("myerror");
   }, "Database", "saveAdvertencia", [ 1, "TesteAdv" ])
};

通过这种方式,您可以获得 node.js 样式的回调,其中第一个参数是错误,第二个是结果:

//define the callback function
var callbackFunction = function(err, result) {
    if (err) {
        console.log("there was an error");
    } else {
        console.log("success", result);
    }
};

//call the plugin
callNativePlugin(callbackFunction);

您无法避免在您的插件中有两个回调,因为这是由 cordova API 强制要求的,但您不必将其公开给您的插件用户。

于 2013-03-21T21:00:02.767 回答
2

如果您正在寻求一种将cordova.exec()异步调用转换为返回值的同步调用的方法,那么简短的回答是您不能。(长答案是你可以使用循环或超时来伪造它,但你不应该这样做。)

正如 Vlad 解释的那样,您可以创建自己的界面,因此您只有一个函数可以调用,但我使用类似这个更简单的版本(在http://htmlpresenter.com/api.html中):

var Database = {
  saveAdvertencia: function(args, callback) {
    cordova.exec(callback,
      function(error) { console.log("Error calling Database.saveAdvertencia: " + error); },
      "Database", "saveAdvertencia", args)
  }
}

如果您需要结果,然后像这样调用它,提供内联回调:

Database.Advertencia([1, "TesteAdv"], function(result) { alert(result); });

当然,如果(似乎是这样)你根本不需要结果,你可以使用这个版本:

function saveAdvertencia() {
  log = function(message) { console.log(message) };
  cordova.exec(log, log, "Database", "saveAdvertencia", arguments);
}

saveAdvertencia(1, "TesteAdv");

(编辑:)此外,这个挑战可能与这个更好的问题有关:

于 2013-08-13T03:57:51.160 回答
0

在 JavaScript 中,我只用一种易于控制的递归方法就能够检索到 PhoneGap 插件的值:

function callNativePlugin(result, error, service, action, json) {
    if (result != null) {
        //alert("SUCCESS: \r\n" + result);
        return result;
    } else if (error != null) {
        //alert("ERROR: \r\n" + error);
        return error;
    }
    return cordova.exec(function(result) {callNativePlugin(result, null, null, null);}, function(error) {callNativePlugin(null, error, null, null);}, service, action, json);
}
于 2013-05-02T20:19:03.303 回答