2013-03-21 74 views
5

我構建了一個非常簡單的PhoneGap插件,以開始測試我要在Android上構建一些本機操作的方式。從PhoneGap Plugin獲取返回值

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

我需要的是檢索來自於同樣的方法操作的結果的方式。總是處理3種方法(1來執行動作,1來定義成功動作,1來定義錯誤動作),這是非常複雜的,因爲當你不能真正控制被調用的時候, PhoneGap在動作完成後調用它們。

如果我需要從Android原生數據庫中檢索一些數據:

  1. 調用JavaScript中的 「cordova.exec」。
  2. PhoneGap會調用你的插件。
  3. 你的插件將返回2件東西:PhoneGap的一個布爾值,它定義了它的一切按預期工作或沒有。將傳遞給成功方法的數據。
  4. 這是我的棘手部分。如果成功或者不成功,你必須創建2個方法,當它們被調用時你不能控制它們,因爲PhoneGap會決定這個方法。我該如何改變這一點?
+0

@mafutrct感謝文本格式指正! – MBarni 2013-03-21 13:43:02

+0

所有功勞歸於@Real,我只是修復了一個小細節 – mafu 2013-03-21 13:46:38

回答

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

不能避免在你的插件兩個回調,因爲這是由科爾多瓦API授權,但你不必暴露,爲你的插件的用戶。

+0

您的意思是callNativePlugin? – 2013-03-22 17:51:50

+0

對不起......我錯過了解代碼。現在已經開始工作了。 – MBarni 2013-03-22 18:17:48

+0

這是錯的嗎? (新版本)http://pastebin.com/MTAH3MZN – MBarni 2013-03-22 19:43:12

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); 
} 
+0

這對一組3個功能仍然不起作用的價值是什麼?你基本上有一個函數的行爲有三種方式,但仍然不起作用,因爲你不能像cordova.exec()這樣的異步調用同步地返回一個值(或者至少不是那麼簡單,你不應該這麼做)。也就是說,從回調函數返回不會影響cordova.exec的返回值,並且可能在cordova.exec返回後發生。更好的是按照設計的方式異步使用它: function callback(value){console.log(value); } cordova.exec(callback,callback,「Foo」,「bar」,[]); – 2013-08-09 04:04:04

+0

這是工作和正在使用我的應用程序。爲什麼降級正在工作的aswer?做出自己的答案,如果它真的更好,並得到很好的解釋,我會把它作爲正確的答案。 – MBarni 2013-08-09 14:06:40

+0

當我說它不起作用時,我的意思是它不會返回結果或錯誤,儘管它會調用本地函數。這只是你問題中的一個更復雜的版本。我會建議另一個答案。 – 2013-08-13 03:51:11

2

如果你問一個辦法把cordova.exec()從異步調用變成同步調用返回一個值,簡短的答案是你不能。 (長的答案是你可以使用循環或超時來僞造它,但你不應該這樣做。)

由於弗拉德解釋,你可以創建自己的界面讓你只能有一個函數來調用,但我用這樣的簡單的版本(在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"); 

(編輯:)另外,這種挑戰可能與此有關,更好的問題: