#javascript #promise #sapui5 #each
#javascript #обещание #sapui5 #каждый
Вопрос:
Я разрабатываю SAPUI5, развернутый на мобильном устройстве, которое испытывает проблемы с производительностью.
Приведенная ниже функция возвращает обещание, она перебирает категории и вопросы, используя подчеркивание _каждых циклов, затем выполняет ЧТЕНИЕ по каждому вопросу по очереди, прежде чем окончательно обновить модель представления и выполнить обещание.
Есть ли какие-либо проблемы с выполнением этого таким образом и можно ли его дополнительно оптимизировать?
_getAnswers: function() {
return new Promise(function(resolve, reject) {
// Loop through Categories for questions.
_.each(oViewData.categories, function(result, index) {
// For each Category, read Answers for each Question
_.each(result, function(resultInner, indexInner) {
// Read AnswerSet on QuestionId
surveyModel.read("/AnswerSet", {
filters: [
new Filter("QuestionId", FilterOperator.EQ, resultInner.QuestionId)
],
success: function(oData) {
oData.results = _.sortBy(oData.results, 'AnswerId');
// Populate Answer Array for Question
var oAnswersArray = [];
_.each(oData.results, function(resultInnerInner, indexInnerInner) {
oAnswersArray.push(resultInnerInner);
});
// Check what the current Answer is for the Question.
_.each(oAnswersArray, function(answerData, answerIndex) {
if (oViewData.categories[resultInner.CategoryId].questions[a].AnswerId === oAnswersArray[answerIndex].AnswerId) {
oAnswersArray[answerIndex].Selected = true;
}
});
// Write back the Answer Array to the viewModel
oViewData.categories[resultInner.CategoryId].questions[a].answers = oAnswersArray;
oViewModel.setData(oViewData);
// Go to next Question in the Loop.
a ;
// resovle Promise and continue.
resolve(true);
},
error: function(oError) {}
});
});
});
});
}
Комментарии:
1. Я бы попытался посмотреть, сможете ли вы прочитать все вопросы сразу. Выдача асинхронного запроса (я предполагаю, что это то, что делает surveyModel.read) для n «результирующих» x m «категорий» была бы … медленной.
2. на мой взгляд, вы можете захотеть построить модель, полученную из серверной части, по-разному — в зависимости, конечно, от объема данных. Вы можете «повесить» некоторые дочерние объекты на родительский объект без вызова серверной части.
Ответ №1:
В информатике есть термин, называемый «Big O’Notation». Это используется для измерения времени, которое требуется вашему алгоритму с учетом объема данных. В общем, вложенные циклы увеличивают время вычислений.
То, что вы делаете, известно как O (N ^ 2), где каждый вложенный цикл увеличивает показатель степени.
Пожалуйста, прочтите это:https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation /
На вашем месте я бы изменил способ доступа к данным и рассмотрел лучшую структуру, которая не включает вложенные циклы.
т.е. Не загружайте элементы в категории, пока не будет нажата категория.
Редактировать: Похоже, что вы возвращаете свой обратный вызов на каждой итерации второго цикла. Это тоже не оптимально.
Комментарии:
1. Нам нужно загрузить информацию в категории, потому что, например, нам нужно определить, были ли даны ответы на все вопросы для категорий и т.д.