Страницы

Поиск по вопросам

Показаны сообщения с ярлыком cordova. Показать все сообщения
Показаны сообщения с ярлыком cordova. Показать все сообщения

четверг, 23 января 2020 г.

Javascript: коллбэки, асинхронность и разделение кода

#javascript #callback #cordova #async


Здравствуйте.

Есть cordova приложение. Есть плагин, который я могу вызвать со стороны javascript,
чтобы получить данные извне, например, через такой враппер:

CordovaWrapper.getRawData(successCallback, errorCallback);


Данные, которые я получу из cordova (они придут как аргументы successCallback), я
бы хотел использовать в HTML приложении. 

Конечно, можно во всех местах, где нужны данные из successCallback, использовать
этот CordovaWrapper, чтобы получить данные и сразу же использовать:

CordovaWrapper.getRawData(function(JSONString) {
    var data = JSON.parse(JSONString)
    for (var i in data) {
        data[i].formattedValue = ''+data[i].value+'';
    }

    // здесь мы используем эти полученные и отформатированные данные

}, function(e) {
    console.log(e)
});


Но мне это не кажется хорошей идеей.
Кроме того, хорошо бы было закешировать распаршенный JSON с примененным к нему форматированием.

Я мало знаком с Javascript, но мне хотелось бы реализовать какой-нибудь провайдер
данных, к которому я смогу обращаться, чтобы получать закешированные и отформатированные
данные из cordova (используя этот гипотетический CordovaWrapper). И в случае работы
приложения в браузере, а не на девайсе, отдавать какие-нибудь захардкоженые данные.

    if (standaloneMode) {
        // какие-то тестовые данные
        return [{
            value: 'test1',
            options: [...],
        }, {
            value: 'test2',
            options: [...],
        }];
    } else {
        return dataFromCordova;
    }


Проблема в том, что получение данных - асинхронное.

Если делать асинхронно, получается коллбэк на коллбэке:

Объявление:

DataProvider.getData = function(callback) {
    var format = function (arr) {
        for (var i in arr) {
            arr[i].formattedValue = ''+arr[i].value+'';
        }
        return arr;
    };

    if (standaloneMode) {
        var testData = [{
            value: 'test1',
            options: [...],
        }, {
            value: 'test2',
            options: [...],
        }];

        callback(format(testData));
        return;
    }

    if (this.cache) {
        callback(this.cache);
    } else {
        var successCallback = function(JSONString) {
            data = JSON.parse(JSONString);
            callback(format(data));
        };
        CordovaWrapper.getRawData(successCallback, errorCallback);
    }
}


И использование:

DataProvider.getData(function (data) {
    //  здесь мы используем эти полученные и отформатированные данные
});


Были мысли загружать данные в провайдер до использования. Но, опять же, нет гарантий,
что момент, когда эти данные будут нужны, не наступит раньше, чем эти данные будут
получены из cordova.

Как правильно сделать? Нормально ли это, хотеть отдельный класс/объект, который будет
предоставлять данные? Нормально ли иметь столько коллбэков из-за асинхронности? Как
делать такого рода кеширование? Как не дублировать строчки вида

callback(format(data));


?
    


Ответы

Ответ 1



JavaScript это ивентво ориентированный язык, то есть лапша из колбеков это обычное дело. К сожелению текущая версия JavaScript не позволяет упростить работу с колбеками, и для этого вам необходимо подобрать библиотеку для упрощения логики работы с событиями. Замечу что если у вас в приложении действительно много колбеков то возможно стоит ознакомиться с Функциональным реактивным программированием. Вот очень мотивирующи доклад к изучению FRP. Но в большинстве случаев FRP будет излишним, и можно воспользоваться Promise (на самом деле это частный случай FRP). Промисы будут достепны в ES6 а пока вы можете воспользоваться реализацией промисов из какой-нибудь библиотеки например jquery Promise - это специальный объект который выпонит успешный callback или callback с ошибкой и гарантирует что один из этих колбеков будет выполнен и выполнен только один раз. На основании этих условий есть разные средства для комбинирования промисов, например метод when из jquery. Если вам нужно больше вариантов для комбинирования промисов, посмотрите библиотеку Q. По поводу вашего вопроса с кешированием ответа я приведу пример с использованием jquery, в других библотеках решение не должно сильно отличаться. В jquery есть класс Deferred который помогает создавать промисы. Вам нужно создать объект Deferred var deferred = new $.Deferred() например в вашем врапере и вернуть промис deferred.promise() В вашем врапере в момент получения данных необходимо вызвать метод resolve если получение данных было успешным или reject в противном случае. У обекта который вы получите в результате метода deferred.promise() будут методы done и fail которые принимают callback. Обратите внимание что колбек вызовится в любом случае, даже если получение данных произошло до добавления колбеков в методы done и fail. Таким образом вы можете создать 1 объект Deferred для каждого запроса в функции получения данных и возвращать промис каждый раз при обрашении к функции. В итоге вы получите кеширование данных и избавитесь от лапшы колбеков. Примеры Deferred Статья про промисы

воскресенье, 12 января 2020 г.

Как организовать полноценный рабочий экземпляр монго дб на андроид

#android #mongodb #cordova


Как организовать полноценный рабочий экземпляр монго дб на андроид со всеми фишками
самой монги - как то геопоиск, междокументные ссылки и тд и тп, при использовании нативного апи.
Цель поиметь частичную реплику базы данных, синхронизируемую посредством wamp в реалтайме,
и собственной синхронизационной процедуры для офлайн изменений.
Может быть кото-то реализовывал запуск монги через cordova или другой инструмент?  
    


Ответы

Ответ 1



Не думаю, что возможно запустить полноценно рабочий экземпляр монги на Android. Его и в списке поддерживаемых платформ нет. Да и дело даже не в этом. MongoDB не сможет нормально функционировать на подобных системах с таким маленьким объёмом доступной памяти для приложений. Были, правда, обсуждения в своё время. Можно попробовать самим собрать билд. UPD: если вам не обязателен MongoDB, то можно использовать Couchbase Lite.

вторник, 31 декабря 2019 г.

PhoneGap или Cordova?

#phonegap #android #cordova


День добрый! Объясните, пожалуйста, есть ли различия между PhoneGap и Cordova?
Просто хотел сделать мобильную версию приложения, и не могу понять, в чем их различия. 
В Сети говорят, что они одинаковые фреймворки, то phonegap  лучше, некоторые за cordova-у.
У  меня нету опыта в этих технологиях, вот и спрашиваю, что выбрать. 
Netbeans как бы рекомендует из коробки cordovu https://netbeans.org/kb/docs/webclient/cordova-gettingstarted_ru.html,
плагина для phonegap не смог найти.
И еще вопрос: с помощью каких из них (phonegap, cordova) можно получить доступ к
дисплею (включать/выключить) смартфона (андроид)? Спасибо.    


Ответы

Ответ 1



Cordova - фреймворк с открытым кодом. Phonegap - обертка для этого фреймворка, принадлежащая Adobe и позволяющая теснее взаимодействовать с другими сервисами Adobe. В первую очередь, с Phonegap Build - это облачный сервис на основе Phonegap, который на основе Cordova, в доме, который построил Джек. О нем ниже. С практической точки зрения, разницы между Phonegap и Cordova нет. Оба устанавливаются локально, оба умеют подтягивать плагины из репозиторев, оба имеют одни и те же глюки, т.к. код в основе один. Разница выглядит примерно так: $usr> phonegap local build android //local - потому что не в облаке, можно remote $usr> cordova build android //кордова всегда локальна Я выбрал Cordova, т.к.: Интеграция с облаком мне не нужна. Я всегда выбираю более "тонкий" стек технологий. Phonegap апдейтится почти одновременно с Cordova, но не одновременно. Например, поддержка 64-bit iOS apps там припозднилась на месяц. Я за open source и не люблю Adobe. Как-то раз мне пришлось переключиться с Cordova на Phonegap Build (я делал и тестировал приложение локально, заказчик создавал бинарники в облаке со своими ключами). Переход занял примерно день, в основном на отлов мелких багов, когда что-то в Cordova работало, а в Phonegap Build - нет. Например, длительность сплэш-заставки в Cordova прописывается в config.xml: Phonegap Build эту настройку проигнорировал, поэтому пришлось подключать плагин для управления заставкой через JavaScript и делать это руками.

воскресенье, 8 декабря 2019 г.

Как с помощью Cordova сделать iOS build для iPhone

#ios #phonegap #cordova


Я сделал следующее:


Установил вирт. машину Max OS X.
На ней установил xcode, cordova, phonegap.
Добавил в своем проекте платформу ios - сработало.
Ввел команду build ios - выполнено успешно.
Сделал джейлбрейк своего 4-го айфона и установил Cydia, AppSynch


А дальше не знаю что делать. Мне кордова не выдает готового ipa файла, в папке ios/build
какой-то бардак. Помогите разобраться плиз, что сделать, чтобы запустить приложение
на iOS девайсе с помощью кордовы?
    


Ответы

Ответ 1



Я делаю так ionic build ios После завершения билда, открываю XCode, и указываю путь до папки с проектом, к примеру: /Applications/MAMP/htdocs/WORK/yourApp/platforms/ios Дальше просто вместо эмулятора выбираю подключенный девайс (iphone 4 jb) через usb и XCode заливает на телефон приложение.

Ответ 2



Насколько знаю запустить приложение можно только с помощью xCode, а cordova помогает собрать проект под выбранную платформу Подключите телефон, выберите устройство и выполните запуск приложения (если выполняется только компиляция то в схеме приложения поменяйте настройку см. документацию на сайте cordova) https://cordova.apache.org/docs/en/latest/guide/platforms/ios/index.html

воскресенье, 7 апреля 2019 г.

PhoneGap или Cordova?

День добрый! Объясните, пожалуйста, есть ли различия между PhoneGap и Cordova? Просто хотел сделать мобильную версию приложения, и не могу понять, в чем их различия. В Сети говорят, что они одинаковые фреймворки, то phonegap лучше, некоторые за cordova-у. У меня нету опыта в этих технологиях, вот и спрашиваю, что выбрать. Netbeans как бы рекомендует из коробки cordovu https://netbeans.org/kb/docs/webclient/cordova-gettingstarted_ru.html, плагина для phonegap не смог найти. И еще вопрос: с помощью каких из них (phonegap, cordova) можно получить доступ к дисплею (включать/выключить) смартфона (андроид)? Спасибо.


Ответ

Cordova - фреймворк с открытым кодом. Phonegap - обертка для этого фреймворка, принадлежащая Adobe и позволяющая теснее взаимодействовать с другими сервисами Adobe. В первую очередь, с Phonegap Build - это облачный сервис на основе Phonegap, который на основе Cordova, в доме, который построил Джек. О нем ниже.
С практической точки зрения, разницы между Phonegap и Cordova нет. Оба устанавливаются локально, оба умеют подтягивать плагины из репозиторев, оба имеют одни и те же глюки, т.к. код в основе один. Разница выглядит примерно так:
$usr> phonegap local build android //local - потому что не в облаке, можно remote
$usr> cordova build android //кордова всегда локальна
Я выбрал Cordova, т.к.:
Интеграция с облаком мне не нужна. Я всегда выбираю более "тонкий" стек технологий. Phonegap апдейтится почти одновременно с Cordova, но не одновременно. Например, поддержка 64-bit iOS apps там припозднилась на месяц. Я за open source и не люблю Adobe.
Как-то раз мне пришлось переключиться с Cordova на Phonegap Build (я делал и тестировал приложение локально, заказчик создавал бинарники в облаке со своими ключами). Переход занял примерно день, в основном на отлов мелких багов, когда что-то в Cordova работало, а в Phonegap Build - нет.
Например, длительность сплэш-заставки в Cordova прописывается в config.xml:

Phonegap Build эту настройку проигнорировал, поэтому пришлось подключать плагин для управления заставкой через JavaScript и делать это руками.

суббота, 16 марта 2019 г.

Javascript: коллбэки, асинхронность и разделение кода

Здравствуйте.
Есть cordova приложение. Есть плагин, который я могу вызвать со стороны javascript, чтобы получить данные извне, например, через такой враппер:
CordovaWrapper.getRawData(successCallback, errorCallback);
Данные, которые я получу из cordova (они придут как аргументы successCallback), я бы хотел использовать в HTML приложении.
Конечно, можно во всех местах, где нужны данные из successCallback, использовать этот CordovaWrapper, чтобы получить данные и сразу же использовать:
CordovaWrapper.getRawData(function(JSONString) { var data = JSON.parse(JSONString) for (var i in data) { data[i].formattedValue = ''+data[i].value+''; }
// здесь мы используем эти полученные и отформатированные данные
}, function(e) { console.log(e) });
Но мне это не кажется хорошей идеей. Кроме того, хорошо бы было закешировать распаршенный JSON с примененным к нему форматированием.
Я мало знаком с Javascript, но мне хотелось бы реализовать какой-нибудь провайдер данных, к которому я смогу обращаться, чтобы получать закешированные и отформатированные данные из cordova (используя этот гипотетический CordovaWrapper). И в случае работы приложения в браузере, а не на девайсе, отдавать какие-нибудь захардкоженые данные.
if (standaloneMode) { // какие-то тестовые данные return [{ value: 'test1', options: [...], }, { value: 'test2', options: [...], }]; } else { return dataFromCordova; }
Проблема в том, что получение данных - асинхронное.
Если делать асинхронно, получается коллбэк на коллбэке:
Объявление:
DataProvider.getData = function(callback) { var format = function (arr) { for (var i in arr) { arr[i].formattedValue = ''+arr[i].value+''; } return arr; };
if (standaloneMode) { var testData = [{ value: 'test1', options: [...], }, { value: 'test2', options: [...], }];
callback(format(testData)); return; }
if (this.cache) { callback(this.cache); } else { var successCallback = function(JSONString) { data = JSON.parse(JSONString); callback(format(data)); }; CordovaWrapper.getRawData(successCallback, errorCallback); } }
И использование:
DataProvider.getData(function (data) { // здесь мы используем эти полученные и отформатированные данные });
Были мысли загружать данные в провайдер до использования. Но, опять же, нет гарантий, что момент, когда эти данные будут нужны, не наступит раньше, чем эти данные будут получены из cordova.
Как правильно сделать? Нормально ли это, хотеть отдельный класс/объект, который будет предоставлять данные? Нормально ли иметь столько коллбэков из-за асинхронности? Как делать такого рода кеширование? Как не дублировать строчки вида
callback(format(data));
?


Ответ

JavaScript это ивентво ориентированный язык, то есть лапша из колбеков это обычное дело. К сожелению текущая версия JavaScript не позволяет упростить работу с колбеками, и для этого вам необходимо подобрать библиотеку для упрощения логики работы с событиями.
Замечу что если у вас в приложении действительно много колбеков то возможно стоит ознакомиться с Функциональным реактивным программированием. Вот очень мотивирующи доклад к изучению FRP.
Но в большинстве случаев FRP будет излишним, и можно воспользоваться Promise (на самом деле это частный случай FRP). Промисы будут достепны в ES6 а пока вы можете воспользоваться реализацией промисов из какой-нибудь библиотеки например jquery
Promise - это специальный объект который выпонит успешный callback или callback с ошибкой и гарантирует что один из этих колбеков будет выполнен и выполнен только один раз. На основании этих условий есть разные средства для комбинирования промисов, например метод when из jquery. Если вам нужно больше вариантов для комбинирования промисов, посмотрите библиотеку Q
По поводу вашего вопроса с кешированием ответа я приведу пример с использованием jquery, в других библотеках решение не должно сильно отличаться.
В jquery есть класс Deferred который помогает создавать промисы.
Вам нужно создать объект Deferred var deferred = new $.Deferred() например в вашем врапере и вернуть промис deferred.promise() В вашем врапере в момент получения данных необходимо вызвать метод resolve если получение данных было успешным или reject в противном случае. У обекта который вы получите в результате метода deferred.promise() будут методы done и fail которые принимают callback. Обратите внимание что колбек вызовится в любом случае, даже если получение данных произошло до добавления колбеков в методы done и fail
Таким образом вы можете создать 1 объект Deferred для каждого запроса в функции получения данных и возвращать промис каждый раз при обрашении к функции. В итоге вы получите кеширование данных и избавитесь от лапшы колбеков.
Примеры Deferred
Статья про промисы