我是量角器的新手,并试图学习量角器中异步呼叫的概念。我无法解析布尔变量的状态,如果任何测试案例失败,执行均可抓住Promise,我将其设置为TRUE以下是seudo代码段。例如:
var test = function (){
var deferred = protractor.promise.defer();
var abort = false;
for (j = 0; j < testCount; j++) {
switch (element.toString()) {
case 'input':
handler.execute().then(function(result){
deferred.fulfill(result);
..
}).catch(function(err){
abort = true;
if(abort){ // goes into if loop
console.log('abort status'+ abort); // prints as true
}
deferred.reject(err);
})
.....
}
if(abort){ //control do not go into if loop outside switch caseeven though abort is true
console.log('abort status'+ abort);
break;
}
}
return deferred.promise;
}
这可能是愚蠢的问题,但我无法解决这个问题。再次感谢,希望这足够清楚,可以理解我的问题。
更新
用承诺更新了代码,我在第二个If语句中使用并添加了break语句,如果测试案例失败,则退出for循环。
使用递归函数而不是循环。
var abort = false;
it('should....', function() {
sampleRecursive(0, testCount, abort)
});
function sampleRecursive(j, testCount, abort) {
switch (element.toString()) {
case 'input':
handler.execute().then(function(result){
deferred.fulfill(result);
...
}).catch(function(err){
abort = true;
if(abort){ // goes into if loop
console.log('abort status'+ abort); // prints as true
}
deferred.reject(err);
})
...
}
if (j < testCount && abort == false) {
sampleRecursive(j + 1, testCount, abort)
}
}
您可以更新上述功能以适合您的测试。
但是,如果您期望在中间休息,则递归功能更容易使用。
当handler.execute()
方法在背景线程中运行时,您的第二个if
在设置abort
的值之前正在运行。
您应该将第二个if
中的代码移至catch
子句中。
编辑
在switch
和if(abort)
语句之间添加等待循环,该语句等待背景操作完成。