#ajax #cordova
#ajax #кордова
Вопрос:
Я загружаю данные в свое приложение с помощью асинхронного вызова AJAX. Этот вызов занимает некоторое время, поскольку сервер работает очень медленно. Загрузка приложения на рабочий стол или телефон в виде веб-сайта показывает ожидаемое поведение: страница загружена — некоторая задержка — обновление сайта загруженными данными. При запуске страницы с использованием phonegap отображается экран-заставка, затем черный экран и через очень долгое время (время выполнения вызова ajax) обычный экран. Я предполагаю, что есть какая-либо причина, по которой Phonegap ожидает завершения вызова перед отображением содержимого. Можно ли это предотвратить / настроить?
Пример кода:
function connect(){
var username = window.localStorage.getItem( 'username' );
var password = window.localStorage.getItem( 'password' );
if(username!=nullamp;amp;password!=null){
jQuery.ajax({
async: true,
type : "GET",
dataType: 'json',
url : loginURL,
success : function(data) {
token=data.token;
connected=true;
oSettingsTile.setInfo("Connected");
oSettingsTile.setInfoState(sap.ui.core.ValueState.Success);
var oFeedModel=new sap.ui.model.json.JSONModel();
jQuery.ajax({
type : "GET",
url : feedURL,
dataType : "json",
async: true,
success : function(data,textStatus, jqXHR) {
oFeedModel.setData(data);
oFeedTile.setInfoState(sap.ui.core.ValueState.None);
oFeedTile.setNumber(oFeedModel.getProperty("/list/length"));
},
error : function(err){
oFeedTile.setInfo("Error loading");
oFeedTile.setInfoState(sap.ui.core.ValueState.Error);
}
});
var oGroupModel=new sap.ui.model.json.JSONModel();
jQuery.ajax({
type : "GET",
url : groupURL,
dataType : "json",
async: true,
success : function(data,textStatus, jqXHR) {
oGroupModel.setData(data);
oGroupTile.setInfoState(sap.ui.core.ValueState.None);
oGroupTile.setNumber(oGroupModel.getProperty("/list/length"));
},
error : function(err){
oGroupTile.setInfo("Error loading");
oGroupTile.setInfoState(sap.ui.core.ValueState.Error);
}
});
feedView.setModel(oFeedModel);
feedDetailView.setModel(oFeedModel);
groupView.setModel(oGroupModel);
groupDetailView.setModel(oGroupModel);
},
error : function(err,status,errT){
token="";
oGroupTile.setNumber(0);
oFeedTile.setNumber(0);
connected=false;
oSettingsTile.setInfo("Error");
oSettingsTile.setInfo(sap.ui.core.ValueState.Error);
}
});
}
}
Комментарии:
1. Я прокомментировал часть загрузки ajax: jQuery.ajax({ тип: «GET», тип данных: ‘json’, URL: «…», успех: функция (данные) { …. Теперь загрузка происходит в течение 1 секунды. Итак, это вызов ajax, которого ожидает Phonegap
Ответ №1:
вы можете подумать, что страница загружается при включенном заставочном экране, но это не так. Весь html / css / js загружается после отключения splashscreen, поэтому, если у вас медленный сервер, это продлится некоторое время, пока вы не увидите содержимое.
Комментарии:
1. Почему это зависит от сервера? Все содержимое хранится локально, а данные загружаются асинхронно. Загрузка одного и того же приложения в веб-браузере происходит быстро. Я думаю, что phonegap ожидает любого сигнала
2. Медленный отклик не всегда необходим из-за того, что cordova / phonegap не использует javascript, но больше зависит от кода и доступной инфраструктуры. Используете ли вы какой-либо специальный фреймворк пользовательского интерфейса? Phonegap не ожидает никаких сигналов, вам следует только следить за событием deviceready. Если у вас большой объем данных, я рекомендовал использовать метод отложенной загрузки вместо того, чтобы показывать только некоторые биты во всех данных. Сначала убедитесь, что ответ сервера стабилен и приемлем.
3. Я заметил, что у вас есть вложенные ajax-запросы, так что на это тоже стоит обратить внимание, я рекомендовал изолировать каждый вызов и вместо записи других ajax-запросов внутрь использовать обратный вызов и внутри обратного вызова поместить свой запрос. Имейте в виду, что из-за асинхронности не рекомендуется запускать несколько вызовов ajax одновременно или параллельно (вы не будете знать, когда точно каждый вызов завершил свою работу, и вы расходуете свой call compite на пропускную способность Интернета устройства), из-за этого я столкнулся с некоторыми проблемами, поэтому попробуйте вызывать каждый запрос после завершения другого с помощью обратных вызовов, дайте ему tru.