angularjs $ q在序列上运行多个promise

时间:2016-04-06 06:11:29

标签: javascript angularjs promise angular-promise

我正在研究AngularJS 1.5.3项目,我在链接承诺方面遇到了麻烦。

我有一个看起来像这样的功能;

this.login = function(u,p){ var promise=$auth.login(u,p).then(...); return promise;}
this.tests = [
    ['Im LoginController, i let users login'],
    ['I have logs attr, to bind current state to view',null,function(){return !!angular.isArray(self.log)}],
    ['I have $auth attr, that expse the $auth service',function(){return !!(self.$auth===$auth)}],
    ['I can get tokens from server',null,function(){return self.login({u:1,pass:1234})},function(){return !!($auth.currentUser.id === 1 && $auth.currentUser.hasValidToken()===true)}
];

我想你可以看到我在这里尝试的东西......

所以数组由

组成
[
    0 => string
    1 => a function that return promise
    2 => a function that confirms that the previous function effects took place
]

我想创建一个自动测试控制器的指令 - 无论如何 - ,

我需要的是循环数组并按顺序执行它们并为[1,2]返回true / false;

我的第一次尝试是使用ngRepeat

直接进入Angular1模板
<ul>
  <li ng-if="$last ng-repeat="test in tests">{{test[0]}} :: {{test[1]() && test[2]()}}</li>
</ul>

失败非常糟糕,因为它们当然不会按顺序执行。所以我意识到我需要将它们包含在承诺中?

1 个答案:

答案 0 :(得分:1)

您可以在使用ng-repeat进行渲染之前在控制器中执行所有测试,然后使用$q.all()确保在将结果存储在单独的变量中时解决所有测试。特别是这些内容:

var testCases = [
    ['Im LoginController, i let users login'],
    ['I have logs...', null, function(){return !!angular.isArray(self.log)}],
];

var promises = [];

scope.testResults = [];
scope.testsExecuted = false;

for (var i = 0; i < this.pendingScenarios.length; i++) {
    var testCase = this.testCases[i];
    if (testCase[1]) {
        var result = $.when(testCase[1]());
        result.then(function(result) {
            testResults[i] = result;
        });
        promises.push(result);
    }
    // ...
}

$q.all(promises).then(function() {
    $scope.testsExecuted = true;
});

我没有测试代码,但我认为你明白了。如果测试返回Promise,则将其放入数组中,最后确保在result.then()存储结果时解析它们。