我当时在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()存储其结果时所有问题都已解决。

10-06 04:28