我正在研究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
<ul>
<li ng-if="$last ng-repeat="test in tests">{{test[0]}} :: {{test[1]() && test[2]()}}</li>
</ul>
失败非常糟糕,因为它们当然不会按顺序执行。所以我意识到我需要将它们包含在承诺中?
答案 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()
存储结果时解析它们。