我可以使用Promises来简化cordova原生调用

时间:2014-10-15 10:29:09

标签: cordova asynchronous promise

我正在研究Cordova移动应用程序。我想与原生File API进行交互,我发现有很多回调。

示例代码:

<script type="text/javascript" charset="utf-8">

// Wait for device API libraries to load
//
document.addEventListener("deviceready", onDeviceReady, false);

// device APIs are available
//
function onDeviceReady() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
}

function gotFS(fileSystem) {
    fileSystem.root.getFile("readme.txt", null, gotFileEntry, fail);
}

function gotFileEntry(fileEntry) {
    fileEntry.file(gotFile, fail);
}

function gotFile(file){
    readDataUrl(file);
    readAsText(file);
}

function readDataUrl(file) {
    var reader = new FileReader();
    reader.onloadend = function(evt) {
        console.log("Read as data URL");
        console.log(evt.target.result);
    };
    reader.readAsDataURL(file);
}

function readAsText(file) {
    var reader = new FileReader();
    reader.onloadend = function(evt) {
        console.log("Read as text");
        console.log(evt.target.result);
    };
    reader.readAsText(file);
}

function fail(evt) {
    console.log(evt.target.error.code);
}

</script>

最近我听说过这个名为Promises的框架。我访问了他们的网站,他们谈论的主要是管理异步AJAX调用。我可以使用Cordova的Promises库来简化异步编程吗?

2 个答案:

答案 0 :(得分:1)

是的,你当然可以使用承诺!我在angularjs / cordova应用程序中经常使用它们。在那里,我们使用模块$q,它提供了一个很好的api。

我认为你应该看一下在http://superherojs.com/#organizing组织javascript代码的部分。他们解释了那里的模块和导出的使用,它们可以帮助你构建你的代码(现在方法fail例如是一个全局可用的方法,从可重用性的角度来看这不太好。

可能的功能可能如下所示:

var FileReader = {
  // we use this to make sure that we only need the inited promises once.
  var initedPromise = null;
  function init(){
    if (initedPromise === null){
      initedPromise = $q.defer();
      // user $q.all([...]) here to resolve the promise when your requirements have been called:
      // - deviceready
      // - FSinited
      // - any other stuff you might want to do.
    } 
    return initedPromise.promise;
  }

  this.readAsText = function(file){
    var def = $q.defer();
    init().then(function(){
      var reader = new FileReader();
      reader.onloadend = function(evt) {
        def.resolve(evt.target.result);
      };
      reader.onerror = function(evt){
        def.reject(evt);
      }
      reader.readAsText(file);
    }, function(e){
      def.reject(e);
    });
    return def.promise;
  }
};

您现在可以将其用于:

FileReader.readAsText("file.txt").then(function(text){
  console.log(text);
},function(e){
  console.log("Failure on loading text file: "+JSON.stringify(e));
});

答案 1 :(得分:0)

是 - 请查看ngcordova.com,因为他们拥有许多Cordova插件的“promise-y”版本。