Pertanyaan Cordova: Bagaimana cara menulis plugin asli yang dapat berulang kali memanggil callback Javascript?


Ketika mengembangkan plugin Cordova, semua tutorial yang saya temukan berjalan seperti ini:

File: AwesomePlugin.js

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

module.exports = AwesomePlugin;

File: 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;
}

File: clientCode.js

AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) { }, function(err) { });

Dalam kode di atas, callback hanya dapat dipanggil satu kali dan kemudian dibuang. Jika Anda mencoba untuk memanggil .success() atau .error() metode objek konteks callback, itu tidak akan berfungsi dan Anda akan mendapatkan pesan log:

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

Sepertinya tidak mungkin untuk menulis metode dengan callback yang dapat disebut berulang kali sebagai .success() dan .error() adalah satu-satunya cara yang didokumentasikan untuk memanggil callback dari dalam kode plugin asli. Meskipun ini adalah sebagian besar yang kami inginkan, ada kalanya kami ingin plugin menjalankan callback berulang kali. Sebagai contoh:

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() di atas akan melakukan berulang kali (mungkin dalam utas yang terpisah) dan memanggil function(hits) dengan setiap eksekusi yang sukses. Jika diimplementasikan dengan cara de-facto (menggunakan callback sekali pakai), Anda harus menggunakan loop (yang buruk karena non-async) atau panggilan-ekor AwesomePlugin.punchRepeatedly() dalam callback (kesalahan-rawan).

Apa yang akan menjadi cara yang benar untuk diterapkan punchRepeatedly() dalam kode asli sehingga dapat mendaftarkan callback sekali dan kemudian jalankan berulang kali?


8
2017-08-25 09:53


asal


Jawaban:


Saya pikir, Anda bisa menggunakan pluginResult dengan keepCallback set properti ke 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);

Anda harus dapat memanggil callback beberapa kali dengan cara ini.


16
2017-08-25 11:22



Dalam jawaban di atas, Setiap kali Anda mengirim hasil plugin selalu sama. Jadi saya mengubah kelas PluginResult untuk menambahkan metode seperti ini:

 public void setStrMessage(String strMessage){ this.strMessage = strMessage;}

Dengan cara ini, saya dapat mengatur pesan yang benar-benar ingin saya kirim ke JS.Jika ada efek samping, tolong beri tahu saya, 3x!


0
2018-04-25 09:21