首页 > 解决方案 > 我如何优化循环+承诺?

问题描述

我正在开发一个部署到遇到性能问题的移动设备的 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) {}
        });
      });
    });
  });
}

标签: javascriptpromisesapui5each

解决方案


在计算机科学中有一个术语叫做“Big O' Notation”。这用于测量给定数据量的算法所花费的时间。一般来说,嵌套循环会使计算时间增加。

您正在做的事情被称为 O(N^2) ,其中每个嵌套循环都会增加指数。

请阅读:https ://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/

如果我是你,我会改变你访问数据的方式,并寻找一个不涉及嵌套循环的更好的结构。

即在单击类别之前不要加载类别中的项目。

编辑:看起来你在第二个循环的每次迭代中都返回你的回调。这也不是最优的。


推荐阅读