我有一个函数,它正确地检索元素的索引,文本==="检查"。它显然是在console.log中打印的:
function getIndex() {
return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) {
colorList.forEach(function (elem, index) {
elem.getText().then(function (text) {
if (text == "check") {
console.log(index);
return index;
}
});
});
});
}
然后,我尝试了很多不同的方法,如何从中检索数据,但还没有成功。最后一种方法就是:
var res = null;
webDriver.promise.fullyResolved(getIndex()).then(function (index) {
res = index;
});
console.log(res);
所以,在这里,我尝试在函数内部初始化res值,这可以保证任何promise解析,但它不起作用,并返回null。
我认为,我在getIndex()函数中有错误,也许,我已将return opertor放在错误的位置,但我需要帮助。我完全不知道如何让它发挥作用。求助。
答案 0 :(得分:2)
您使问题过于复杂,请使用reduce()
,而不是“forEach”:
function getIndex() {
return element.all(by.css(".palette__item > span")).reduce(function (acc, elem, index) {
return elem.getText().then(function (text) {
if (text == "check") {
return index;
}
});
}, -1);
}
用法:
getIndex().then(function (index) {
console.log(index);
});
作为旁注 - 尽量不要在定位器中使用ng-scope
类 - 它是一个纯粹的技术角度特定类,它不会给定位器带来意义。
答案 1 :(得分:1)
我目前无法调试它,但这应该可行:
function getIndex() {
return element
.all(by.css(".palette__item.ng-scope>span"))
.then((colorList) => {
// get text for all elements
return Promise.all( colorList.map( (el) = el.getText() ) );
})
.then((colorList) => {
// we need both text and index
return colorList.map( (el, ind) => [el, ind] )
// but just the elements with text "check"
.filter( (elArr) => ellArr[0] == 'check' )
// at this point we can throw away the text and just use the index
.map( (elArr) => elArr[1] );
})
}
您的基本问题是,您将返回promises的函数与其他迭代器函数混合在一起。因此,当您最终调用return
时,您完全失去了承诺上下文。
答案 2 :(得分:1)
一些事情: 对于初学者,您在promise之外初始化变量,但在promise中分配变量的值。这很好,但是看一下你向我们展示的例子中你的console.log()。如果你将console.log语句保留在最底部,那么它将在你的promise解析之前执行,因此变量res的值将为null。
您是否尝试在承诺中注销res
的值?
回到getIndex
函数...为什么在forEach函数中使用promises?您是否尝试过以下操作:
function getIndex() {
return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) {
colorList.forEach(function (elem, index) {
var temp = elem.getText()
if (temp == "check") {
console.log(index);
return index
});
});
});
}
这就是我可以建议你在这篇文章中提供的大量信息。这样做的关键教训是更好地理解异步代码与同步代码的区别。