【问题标题】:Cordova (Ionic2) custom plugin: manage Angular2 new Promise() with cordova.exec() successHandlerCordova (Ionic2) 自定义插件:使用 cordova.exec() successHandler 管理 Angular2 new Promise()
【发布时间】:2017-03-07 15:11:45
【问题描述】:

我正在构建一个 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;

在链接到“MyPlugin.js”文件的 Java 类中,我有类似的内容:

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时,JScordova.exec会启动函数successResultHandler。 我想知道如何使用 Angular2 Promise 来捕获异步事件???

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

我正在考虑在“MyPlugin.js”中做类似的事情:

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

但当然没有任何意义,你如何在resolve中捕获函数successResultHandler的结果。

有人有想法吗?

【问题讨论】:

    标签: cordova angular promise cordova-plugins ionic2


    【解决方案1】:

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

    【讨论】:

    • 我看起来确实有道理。但无法弄清楚如何使它像它所写的那样工作。我会解决它并让你知道。
    • 这行得通,错误在我这一边,感谢@DaveAlden 让我开箱即用的思维方式更好地理解 Angular2 Promise。
    猜你喜欢
    • 2016-12-04
    • 2017-04-19
    • 1970-01-01
    • 2017-09-27
    • 2016-12-24
    • 2016-02-03
    • 2017-01-27
    相关资源
    最近更新 更多