Adquiere el valor devuelto de PhoneGap Plugin

Construí un complemento PhoneGap muy sencillo para comenzar a probar la forma en que voy a crear algunas acciones nativas en 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); } 

Java:

 @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; } 

Lo que necesito es una forma de recuperar el resultado de la acción en el mismo método. Es muy complicado tratar siempre con 3 métodos (1 para ejecutar la acción.1 para definir cuál será la acción de éxito.1 para definir cuál será la acción de error.) Cuando realmente no controlas cuando se llaman, ya que PhoneGap llama después de que la acción se haya completado.

Si necesito recuperar algunos datos de la base de datos nativa de Android:

  1. Llame a JavaScript el "cordova.exec".
  2. PhoneGap llamará a su plugin.
  3. Su plugin devolverá 2 cosas: Un booleano para PhoneGap definiéndolo todo funcionó como se esperaba o no. Los datos que se pasarán a los métodos de éxito.
  4. Aquí está la parte difícil para mí. Si tiene éxito o no, usted tiene que crear 2 métodos que usted no tiene el control de cuando serán llamados, porque PhoneGap decidirá eso. ¿Cómo cambio esto?

3 Solutions collect form web for “Adquiere el valor devuelto de PhoneGap Plugin”

Utilizo este patrón para tener sólo una devolución de llamada para las funciones proporcionadas por el complemento:

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

De esta manera obtendrás callbacks de estilo node.js en las que el primer argumento es el error y el segundo es el resultado:

 //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); 

No puedes evitar tener dos devoluciones de llamada en tu plugin, ya que esto es obligatorio por la API de cordova, pero no tienes que exponer eso a los usuarios de plugins.

Si está pidiendo una forma de convertir cordova.exec() de una llamada asincrónica en una llamada síncrona que devuelve un valor, la respuesta breve es que no puede. (La respuesta larga es que puedes falsificarlo usando un bucle o un tiempo de espera, pero no deberías hacerlo).

Como explica Vlad, puedes crear tu propia interfaz para que solo tengas una función para llamar, pero utilizo algo como esta versión más sencilla (en 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) } } 

A continuación, llámelo de este modo proporcionando la devolución de llamada en línea si necesita el resultado:

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

Por supuesto si (como parece ser el caso) no necesita el resultado en absoluto, sólo puede utilizar esta versión:

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

(Editar 🙂 También, este desafío puede estar relacionado con esto, mejor pregunta:

  • Llamar una función asíncrona Javascript sincrónicamente

Dentro de JavaScript, pude recuperar el valor del plugin PhoneGap con sólo un método recursivo fácilmente controlable:

 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); } 
  • Cómo llamar a la función en el marco iónico + angularjs?
  • Instalación de Phonegap / Cordova 3.1 plugins (código de barras)
  • Salir de la aplicación cuando haga clic en el botón de androide teléfono?
  • App PhoneGap Crash cuando toma una nueva foto con Plugin de cámara
  • Phonegap Plugin Actividad Importación Layout
  • Phonegap: cómo comprobar si el gps está habilitado
  • Android - PhoneGap Native Controls
  • gap_init llamado de origen restringido
  • La generación de Gradle falló cuando el soporte de importación-v4-22.0.0
  • La jarra de Córdoba falta en la brecha telefónica 3.5.0
  • Plugin de servicio de fondo de Android en el teléfono
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.