2014-10-15 2 views
1

Я работаю над мобильным приложением в Кордове. Я хочу взаимодействовать с родным файловым API-интерфейсом, и я наблюдаю, что есть много обратных вызовов.Могу ли я использовать обещания для упрощения родственных вызовов cordova

Пример код:

<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> 

Недавно я услышал об этой рамке под названием Обещание. Я посетил их веб-сайт, и они говорят о основном управлении вызовами async AJAX. Могу ли я использовать библиотеку Promises с Cordova для упрощения асинхронного программирования?

ответ

1

да, конечно, вы можете использовать обещания! Я использую их много в своих приложениях angularjs/cordova. Там мы используем модуль $q, который предлагает хороший api.

Как я думаю, вам, вероятно, стоит взглянуть на раздел организации кода javascript на http://superherojs.com/#organizing. Они объясняют использование модулей и экспорт там, которые могут помочь вам структурировать ваш код (сейчас метод 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)); 
}); 
0

Да - проверьте ngcordova.com, так как у них есть «обещание-y» версии многих плагинов Кордовы.

Смежные вопросы