Cordova(Ionic2)自定义插件:使用cordova.exec()successHandler管理Angular2新Promise()

时间:2016-10-25 14:04:54

标签: cordova angular promise cordova-plugins ionic2

我正在构建 Cordova插件以与 Ionic2 一起使用。我对Cordova(和自定义插件)很有经验,但对Ionic2很新(因此在Angular2,TypeScript 中也是新的)。

(我现在要问的是,我曾经用Jquery Deferred管理它)

在我的" app.component.ts"我有文件:

import...

declare var MyPlugin: any;

@Component({
  templateUrl: 'app.html'
})

export class MyApp {
  ...
  initializeApp() {
    this.platform.ready().then(() => {
      StatusBar.styleDefault();
      MyPlugin.action();
    });
  }
  ...
}

我不会详细介绍" plugin.xml"我的插件的文件。这很好。

" MyPlugin.js"就是这样:

var PLUGIN_NAME = "MyPlugin";

var MyPlugin =function(){};

MyPlugin.action(){
    cordova.exec(
        successResultHandler,
        errorResultHandler,
        PLUGIN_NAME,
        action,
        []
    );
} 
exports.module=MyPlugin;

在我的Java类链接到" MyPlugin.js"文件我有类似的东西:

public class MyPlugin extends CordovaPlugin {

    @Override
    public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
          //something async
          callbackContext.success()
    }
}

当Java类触发callbackContext.success时,JS cordova.exec将启动函数successResultHandler我想知道如何使用Angular2 Promise来捕获异步事件???

我开始编写一些代码,但它对我应该使用的顺序没有意义。

我想在" MyPlugin.js"中做类似的事情:

MyPlugin.action(){
   return new Promise(function(resolve,reject){
    cordova.exec(
        successResultHandler,
        errorResultHandler,
        PLUGIN_NAME,
        action,
        []
    );
    });
} 

但当然它没有任何意义,你如何以successResultHandler的方式捕捉到resolve函数的结果。

有人有想法吗?

1 个答案:

答案 0 :(得分:3)

Promise构造函数传递给回调函数的resolve和reject参数本身就是函数,所以你应该能够做到这样的事情:

MyPlugin.action(){
   return new Promise((resolve,reject) => {
        cordova.exec(
            resolve,
            reject,
            PLUGIN_NAME,
            action,
            []
        );
    });
};

然后像这样调用它:

MyPlugin.action().then(() => {
    console.log("Success");
},(err) => {
    console.error(err);
});