我当时在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>
失败非常糟糕,因为它们当然不会按顺序执行。所以我意识到我需要把它们包装在诺言中吗?
最佳答案
您可以在控制器中执行所有测试,然后再使用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()
存储其结果时所有问题都已解决。