我有一个表格,它包含一个页面上大约50行和每列。我想从表中获取所有行并编写一个函数来检查所有单词的第二列是否包含单词“Silver”。我试过下面的代码,但它不起作用。有人可以请求帮助,我错过了一个我不是很好的Javascript承诺。如果找到匹配字符串,我只想增加一个计数,然后在结束时返回计数。
fetchValues(SearchString){
var matchcount=0;
var count = this.ContentTable.Rows.count();
for (var i=0;i<count-1;i++) {
return this.ContentTable.element(by.css('[id*="DXDataRow'+i+'"]'))
.then((Row) =>{
return this.ContentTable.Row.element(by.css('[id*="uxSetList_tccell'+i+'_1"]'))
.then((Column)=>{
var CoinInfo = this.ContentTable.Row.Column.element(by.css('a')).getText();
if (CoinInfo.indexOf(SearchString)>=0)
{
matchcount =matchcount+1
}
return matchcount;
});
});
}
}
答案 0 :(得分:1)
首先,您要从for()
循环中返回一个值。这可以保证你的循环只能运行一次,而你只需要检查一行。那是你要的吗? (不,真的,我不知道。)你是否想要创造许多承诺并将他们的结果合并为一个数字?您可能希望使用Promise.all()
来组合您创建的所有promise的值,并从该meta-promise中返回一个值:
var myPromises = [];
for (var i = 0; i < count; i++) {
myPromises.push(this.ContentTable.element(by.css('[id*="DXDataRow'+i+'"]'))
.then(/* ...blah blah blah ... */)
);
}
// return a single value from this function containing data from all promises
return Promise.all(myPromises).then((promiseResultsArray) => {
/* calculate match count */
});
第二,我认为你的承诺本身写得不正确。您假设当您的承诺的回调是运行时,i
的值与承诺的回调定义的i
的值相同。由于承诺如何在JS中起作用,实际情况并非如此。
正在发生的事情是你的for()
循环创建了一堆承诺然后,在未来某个未定义的位置,其中一个承诺得到解决,你传递给它的函数.then()
方法运行。这个函数知道i
- 毕竟它就在函数体中! - 但现在i
的值等于count - 1
的值。我们现在在将来,请记住,for()
循环已经终止,循环的终止条件是i === count - 1
。这将是您在此循环中创建的每个承诺的情况,因为它们 all 在循环终止后执行。
您可以通过多种方式解决此问题。可能最干净的是声明一个新变量,初始化为当前值i
并且永远不会改变,并引用.then()
回调中的那个:
var i = 0;
var myPromises = [];
for (i = 0; i < count; i++) {
var currentCount = i;
myPromises.push(this.ContentTable.element(by.css('[id*="DXDataRow'+currentCount+'"]'))
.then(/* ...blah blah blah ... */)
);
}
// return a single value from this function containing data from all promises
return Promise.all(myPromises).then((promiseResultsArray) => {
/* calculate match count */
});
如果您想了解更多信息,那么有很多关于如何使用promises的问题。