Как ждать JSONModel.запрос loadData () в sapui5 / openui5

в sapUI5 / openUI5 у меня есть JSONModel, который я заполняю файлом с сервера:

var oModel = new JSONModel();
oModel.loadData("http://127.0.0.1/data/config.json");
console.log(JSON.stringify(oModel.getData()));

консоль журналы пустой oModel поскольку запрос асинхронный.

Как сделать его синхронным так console.log() вызывается после загрузки данных?

5 ответов


использование синхронных запросов ajax не рекомендуется, поскольку он блокирует пользовательский интерфейс и, вероятно, приведет к предупреждению в консоли.

Вы можете прикрепить к Model.requestCompleted событие для доступа к асинхронно загружаемых данных:

oModel.attachRequestCompleted(function() {
        console.log(oModel.getData());
    });

ключевое слово, которое вы ищете, - "отложенный" - объект --> он позволяет вам ждать запроса AJAX в SAPUI5.

проверьте это для контекста SAPUI5:SAPUI5 дождитесь отложенного объекта // дождитесь .сделано() функция


вы можете использовать прослушиватель attachRequestCompleted из модели [1]

model.attachRequestCompleted(function(){
    console.log(this.getData()); //"this" is the model
});

другой функции

$.get(url, function(response){
    console.log(response);
    model.setData(response);
});
// or
$.ajax(url, {
    success: function(){
        console.log(response);
        model.setData(response);
    }
});

это имеет то преимущество, что вы можете настроить запрос с каждым параметром, который jQuery."Аякс" принимает [2]


другой способ достичь этого-использовать attachEventOnce метод из EventProvider.

oModel.attachEventOnce("requestCompleted", function(oEvent) {
    console.log(JSON.parse(oEvent.getParameter("response").responseText));
}, this);

лучше всего использовать этот подход, когда вам нужно реагировать только на один запрос, а не на все. В противном случае, если вы используете oModel.attachRequestCompleted(...), все запросы будут проходить через одну и ту же функцию обработчик.

вы также можете использовать метод сцепления, чтобы сделать это немного легче.

oModel.attachEventOnce(...) возвращает объект, который вызвал метод, поэтому вы можете загрузить свои данные и обработать обратный вызов все в одном заявлении.

oModel.attachEventOnce("requestCompleted", function(oEvent) {
    console.log(JSON.parse(oEvent.getParameter("response").responseText));
}, this).loadData("http://127.0.0.1/data/config.json");

это сначала выполнит loadData() запрос, а затем консоль ответа, когда запрос был завершен. Он будет использовать функцию обратного вызова только при первом запросе. Последующие запросы не будут проходить через функцию обратного вызова.

если вы хотите, чтобы все запросы проходили через одну и ту же функцию обратного вызова, вы можете сделать то же самое, но с помощью oModel.attachRequestCompleted(...)

oModel.attachRequestCompleted(function(oEvent) {
    console.log(JSON.parse(oEvent.getParameter("response").responseText));
}, this).loadData("http://127.0.0.1/data/config.json");

это выполнит loadData() запрос, консоль ответа, а также консоль ответа на все последующие запросы.

Примечание: будьте осторожны, используя this в функции обратного вызова. Если вы не пройдете this в качестве параметра attachRequestCompleted(...) или attachEventOnce(...) методы, затем this потеряет исходный контекст в качестве контроллера и унаследует контекст объекта, вызывающего функцию. ответ herrlock демонстрирует, как контекст this изменения.

API поставщика событий Ссылка


оказалось, что есть параметр в .loadData() функция для создания вызова синхронизации:

oModel.loadData("http://127.0.0.1/data/config.json", "", false);

посмотреть API-ссылка как хорошо.