【问题标题】:Is there a way I can wait for the outcome of multiple promises in an angular-ui-router resolve?有没有办法可以在 angular-ui-router 解析中等待多个承诺的结果?
【发布时间】:2016-04-24 10:32:46
【问题描述】:

目前我的代码如下所示:

 resolve: {
            adminTestLevel: ['testService', (tes: ITestService) => {
                return tes.getAdminTestLevel();
            }],
            adminTestStatus: ['testService', (tes: ITestService) => {
                return tes.getAdminTestStatus();
            }],
            adminTestType: ['testService', (tes: ITestService) => {
                return tes.getAdminTestType();
            }],
            adminTestGradeType: ['testService', (tes: ITestService) => {
                return tes.getAdminTestGradeType()
            }],
            exams: ['testService', (tes: ITestService) => {
                return tes.getExams();
            }],
            examTypes: ['testService', (tes: ITestService) => {
                return tes.getExamTypes();
            }],
            testOrderBy: ['testService', (tes: ITestService) => {
                return tes.getTestOrderBy();
            }],
            topics: ['testService', (tes: ITestService) => {
                return tes.getTestsTopics();
            }],
        },

有没有一种方法可以简化这一点,这样我就不必注入这么多的 ITestService?此外,我不需要所有不同的解决方案,如果可能的话,我想将它们组合成一个。

【问题讨论】:

    标签: angularjs angular-ui-router angular-promise


    【解决方案1】:

    你可以试试$q.all(promises)

    来自 ($q) 的文档:

    $q.all(promises);
    将多个 Promise 组合成一个 Promise,当所有输入 Promise 都被解析时,该 Promise 被解析。

    因此您可以将多个 Promise 组合成一个 Promise 数组并等待解决。你的代码可能看起来像:

    resolve: {
        required_data: function($q, testService) {
            return $q.all([
                testService.getAdminTestLevel(),
                testService.getAdminTestStatus(),
                testService.getAdminTestType()
    
                // and so on for all other promises
            ])
        }
    }
    

    然后在您的控制器中,也来自相同的文档

    $q.all(promises)
    返回一个单独的 Promise,该 Promise 将通过值的数组/散列解析,每个值对应于 Promise 数组/散列中相同索引/键处的 Promise

    您可以从注入控制器的required_data 访问结果。
    例如adminTestLevel 将在required_data[0] 可用...等等,按照您在路由器中创建承诺数组的相同顺序。

    【讨论】:

      【解决方案2】:

      你可以使用 $q.all

      resolve: {
          myDate: function($q, tes) {     
              return $q.all([tes.getAdminTestLevel(), ... , tes.getTestsTopics()]);
          }
      }
      

      myData 只会在数组中的所有承诺都解决后才会解决

      $q.all 会给你一个结果数组,你可以在你的控制器中使用,你可以通过索引访问它们,所以它不如普通注入那么方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2019-06-30
        • 2014-06-14
        相关资源
        最近更新 更多