我正在使用量角器和黄瓜框架;如何突破.filter或.map循环?如果找到匹配项,我不想继续进行迭代!
Page.prototype.getElementByKey = function (key) { var foundElement = null; return someElement.all(by.css('.someClass')).map(function (rawItem, index) { var itemObject = new ItemObjectClass(rawItem); return itemObject.getItemKey().then(function (foundItemKey) { var matched = String(foundItemKey).trim() === String(key).trim(); console.log(' Matched: { ' + matched + ' } index {'+index+'}'); //if we have a match break out of the .filter function if (matched) { foundElement = itemObject; throw new Error("Just our way of breaking out of .filter() above"); } }); }).then(function () { //callback throw new Error('\n!!!!!Callback should not be called; this means that we could not find an element that matched the passed in key above'); }, function (error) { //error console.log('\n*******************errorCallback was called; '+error); return foundElement; }); };
上面的代码找到了元素,但是继续进行迭代直到结束,而不是在存在匹配项时停止并通过调用 errorCallback 函数进行 中断 。
鉴于.map函数返回“ 解析为map函数返回的值数组的诺言 ” http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map,我正在利用如果无法解决承诺,则承诺将调用errCallback的事实。
通过抛出伪造的错误,应该调用 errorCallback ,从而脱离.map循环。
不幸的是,它成功引发了错误,但继续循环而不是中断。我知道,因为当我
console.log(“ boolean” + matched +“ and index” + index);
我得到这个:
matched: false index: 0 matched: false index: 1 matched: true index 2 //it should have stopped here since matched = true matched false index 3 // this should NOT have printed
所以突破没有任何想法吗?
您将返回单个元素,因此.reduce更可取。
.reduce
这是一个使用示例,它返回文本为“ mylink”的第一个链接:
var link = element.all(by.css('a')).reduce(function (result, elem, index) { if(result) return result; return elem.getText().then(function(text){ if(text === "mylink") return elem; }); }).then(function(result){ if(!result) throw new Error("Element not found"); return result; });