当前位置: 首页 > 知识库问答 >
问题:

Angular JS循环promise

祝英博
2023-03-14

我这里有个情况。我有一个promise函数,它以这种方式运行

>

  • 我的promise函数get问题调用另一个promise函数DB.查询,它从mysqlite数据库获取结果(Main_Question)。

    当我得到DB查询的结果后,我调用get答案函数,它也是一个获取该问题答案的promise函数

    现在主问题可能有N个子问题。所以我再次运行DB。获取所有子问题的查询。

    现在,我必须找到这些问题的答案。显然,它只能通过循环来完成。所以我运行了一个for循环,循环遍历Sub_问题的每个元素以得到它的答案

    现在的问题是第4步,循环运行良好,但不返回promise响应,因此我有时会得到每个子问题答案的错误值。

    这是我的密码

    self.getQuestion = function(questionNumber, sectionId) {
    
    var deferred = $q.defer();
    
    var question = {};
    question.hasCounter = false;
    question.hasDetail = false;
    question.hasSubSection = false;
    
    console.log('SELECT * FROM question WHERE question_type = 1 AND question_number = '+ questionNumber +' AND section_id = ' + sectionId);
    DB.query('SELECT * FROM question WHERE question_type = 1 AND question_number = ? AND section_id = ?', [questionNumber, sectionId])
    .then(function(result){
      console.log(result);
      question.main = DB.fetch(result);
    
      console.log(question.main);
      Answer.getAnswer(question.main.question_id).then(function(answer) {
    
        question.main.answer = answer;
    
        //Check if this question has any counter question
    
        console.log('SELECT * FROM question WHERE question_type = 2 AND parent_id = ' + question.main.question_id);
        DB.query('SELECT * FROM question WHERE question_type = 2 AND parent_id = ?', [question.main.question_id])
        .then(function(result){
          console.log(result);
          if(result.rows.length == 0)
          {
            question.hasCounter = false;
    
            //Check if this question still has any subsection (s)
            console.log('SELECT * FROM question WHERE section_id = '+ sectionId +' AND question_number = '+ question.main.question_number +' AND question_number_section != ""');
            DB.query('SELECT * FROM question WHERE section_id = ? AND question_number = ? AND question_number_section != ""', [sectionId, question.main.question_number])
            .then(function(result){
              if(result.rows.length == 0)
              {
                question.hasSubSection = false;
                deferred.resolve(question);
              }
              else
              {
                question.hasSubSection = true;
                question.sub = DB.fetchAll(result);
                console.log(question.sub);
    
                for (var i in question.sub) 
                {
                  console.log("i+"+i);
                  (function(j) 
                  {
                    console.log("j+"+j);
                    question.sub[j].answer = {};
                    Answer.getAnswer(question.sub[j].question_id).then(function(res) {
                      question.sub[j].answer = res;
    
                      if(j == (question.sub.length-1))
                      {
                        deferred.resolve(question);
                      }
                    })
                  })(i);
                };
              }
            });
          }
          else
          {
            question.hasCounter = true;
            question.counter = DB.fetch(result);
            Answer.getAnswer(question.counter.question_id).then(function(answer) {
              question.counter.answer = answer;
            });
    
            //Get detail question
            DB.query('SELECT * FROM question WHERE question_type = 3 AND parent_id = ?', [question.counter.question_id])
            .then(function(result){
              question.detail = DB.fetchAll(result);
    
              question.hasDetail = true;
    
              for (var j in question.detail) 
              {
                (function(i)
                {
                  question.detail[i].answer = {};
                  console.log(question.detail[i].question_id);
                  Answer.getDetailAnswer(question.detail[i].question_id, i).then(function(res) {
    
                    console.log(res);
                    question.detail[i].answer = res;
    
                    if(j == (question.detail.length-1))
                    {
                      deferred.resolve(question);
                    }
                  })
                })(j);
              };
            });
          }
        });
      });
    });
    
    return deferred.promise;
      };
    
    
    self.getAnswer = function(questionId) {
    
    var deferred = $q.defer();
    DB.query('SELECT * FROM answer WHERE question_id = ?', [questionId])
    .then(function(result){
    
      answer = DB.fetch(result);
    
      if(answer && answer.answer_type == 3)
      {
        deferred.resolve(answer);
      }
    
      //Get Answer Option
      if(answer)
      {
        DB.query('SELECT * FROM answer_option WHERE answer_id = ? ORDER BY option_code', [answer.answer_id])
        .then(function(result){
    
          answer.answerOptions = DB.fetchAll(result);
    
          deferred.resolve(answer);
        });
      }
    });
    
    return deferred.promise;
     };
    
      self.getDetailAnswer = function(questionId, index) {
    
    var deferred = $q.defer();
    var answer = [];
    
    DB.query('SELECT * FROM answer WHERE question_id = ?', [questionId])
    .then(function(result){
    
      answer[index] = DB.fetch(result);
    
      if(answer[index] && answer[index].answer_type == 3)
      {
        console.log("Resolved: " + answer[index].answer_id);
        deferred.resolve(answer[index]);
      }
    
      //Get Answer Option
      if(answer[index])
      {
        DB.query('SELECT * FROM answer_option WHERE answer_id = ? ORDER by option_code', [answer[index].answer_id])
        .then(function(result){
    
          //console.log(answer.answer_id + " / " + questionId);
    
          answer[index].answerOptions = DB.fetchAll(result);
    
          deferred.resolve(answer[index]);
          console.log("Resolved 2: " + answer[index].answer_id + " / " + questionId);
        });
      }
    });
    
    return deferred.promise;
     };
    
  • 共有1个答案

    陆文康
    2023-03-14

    您必须等待所有promise通过$q.all()

    获取子答案应该与此类似(我可能用括号搞乱了一些东西):

    var subPromises = [];
    for (var i in question.sub) 
    {
       console.log("i+"+i);
       (function(j) {
           console.log("j+"+j);
           question.sub[j].answer = {};
           var subPromise = Answer.getAnswer(question.sub[j].question_id).then(function(res) {
              question.sub[j].answer = res;
           });
           subPromises.push(subPromise);
        })(i);
    }
    $q.all(subPromises).then(function() {
        deferred.resolve(question);
    });
    

    另外,看看这个:等待所有的promise都解决。

     类似资料:
    • 问题内容: 我本来打算通过 在。有几点我不了解。 迭代器函数的用途是什么?没有它,还有什么办法吗? 如下所示,键和值的意义是什么? PS: 我试图在不带参数的情况下运行此函数,但它不起作用。 这是我的: 我的档案: 另一个问题 :如果在控制台中出现条件并显示“ username is thomas”,为什么上面的功能没有打开? 问题答案: 问题1和2 因此,基本上,第一个参数是要迭代的对象。它可以

    • Angularjs ng用div标记重复。。我有一个带有div标记的代码,如图所示。。我想重复整个div,在第二个循环中img src是不同的。。如何使用angularjs中的ng repeat指令执行此操作?

    • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

    • 问题内容: 我已经成功地将AngularJs与OOP结合使用了一段时间,所提供的方法允许您将类定义为angular服务,以后可以像这样扩展或继承: 使用所描述的方法使您能够定义完美地集成到角度基础架构中的类。您可以从OOP和AngularJs这两个世界获得各种漂亮的功能。依赖注入对于您的类是免费的,它使您的类变得简单,允许将许多样板控制器代码放入某些基类中,以便以后重用。 然而 AngularJs

    • 问题内容: Angular确实在其HTML指令中使用数字为for循环提供了一些支持: 但是,如果您的范围变量包含具有动态数字的范围,则您每次都需要创建一个空数组。 在控制器中 在HTML中 这行得通,但是这是不必要的,因为我们根本不会在循环中使用范围数组。有谁知道设置最小值/最大值的范围或常规值? 就像是: 问题答案: 我稍微调整了这个答案,想到了这个小提琴。 过滤器定义为: 重复使用如下:

    • 问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数

    • 问题内容: 我需要第二个$ index用于嵌套的ng-repeat循环。我应该在哪里放? AngularJS网站说 可以使用ngInit为这些属性创建别名。例如,在嵌套ngRepeats时,这可能很有用。 如果我再次使用$ index,它似乎可以工作,但是我不确定这是否正确?我敢肯定有一种简单而正确的方法,我只是找不到一个例子。 谢谢 问题答案: 将引用最内层作用域的索引,因此,如果您需要它,则可