我正在研究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库来简化异步编程吗?
答案 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”版本。