javascript - 我如何优化循环+承诺?
问题描述
我正在开发一个部署到遇到性能问题的移动设备的 SAPUI5。
下面的函数返回一个promise,它使用下划线_each 循环遍历类别和问题,然后依次对每个问题执行READ,最后更新视图模型并解决promise。
这样做有什么问题吗?可以进一步优化吗?
_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) {}
});
});
});
});
}
解决方案
在计算机科学中有一个术语叫做“Big O' Notation”。这用于测量给定数据量的算法所花费的时间。一般来说,嵌套循环会使计算时间增加。
您正在做的事情被称为 O(N^2) ,其中每个嵌套循环都会增加指数。
请阅读:https ://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
如果我是你,我会改变你访问数据的方式,并寻找一个不涉及嵌套循环的更好的结构。
即在单击类别之前不要加载类别中的项目。
编辑:看起来你在第二个循环的每次迭代中都返回你的回调。这也不是最优的。
推荐阅读
- javascript - Javascript ES6 递归函数
- javascript - React-Native ScrollView 仅适用于 react-native-paper 项目
- python - 如果 nan 在列表列表中,则删除列表
- javascript - 我似乎无法将一行异步添加到@angular/material:table 示意图的表格中
- node.js - TypeError: body is not iterable - RabbitMQ, Celery worker NodeJs,
- reactjs - 单击链接时如何关闭移动菜单以做出反应?
- python - ValueError: bad marshal 不能通过删除 .pyc 文件来解决?
- javascript - Redux 和 ReactJS Hooks:UseEffect 返回一个空状态
- html - 由于绝对位置和 z 索引,链接无法正常工作
- ios - 当 clipToBounds 为 true 时,Swift UINavigationBar 背景图像不覆盖状态栏