Так что я думаю, что вы неправильно понимаете некоторые ключевые концепции JavaScript / TypeScript здесь.
Во-первых, вы неправильно используете async / await. Если вы используете .then
, вам не требуется асинхронизация / ожидание.
Во-вторых, я думаю, вы предполагаете, что простой вызов функции вернет значение из вашего обещания, но это неправильно. Вам нужно явно сказать return
для каждой функции, из которой вы хотите вернуть значение.
В-третьих, forEach
фактически ничего не возвращает (то есть undefined
). Вместо этого вы должны использовать map
, если хотите «сопоставить» каждый элемент в одном списке с другим списком.
В любом случае, этот код очень вложенный, и я бы сначала предложил разбить его на отдельные функции, так что мы можем разобрать, что здесь происходит. Но вот что я думаю, что вы пытаетесь выполнить sh.
// This function will get all values with the tagName ('tr') an send them to processList
function verifyCreateAuditReport(fieldValue?: string): Promise<ElementFinder[]> {
return this.auditCriteriaReport.all(by.tagName('tr')).then((rows) => processRowList(rows, fieldValue))
}
// This function will take all the rows, and, for each column in each row,
// it'll check if the text is equal to the field value, and push it to `retval` if so.
// Then we return `retval`, which is a list of `ElementFinder`
function processRowList(rows: ElementFinder[], fieldValue?: string): Promise<ElementFinder[]> {
return rows.all(by.tagName('td > span')).then(async (cols) => {
const retval: ElementFinder[] = [];
for (const col of cols) {
const columnText = await col.getText();
if (columnText === fieldValue) {
retval.push(columnText);
}
}
return columnText;
})
}
В качестве заключительного замечания я бы предложил использовать ===
вместо ==
. Вы могли бы хотеть Google это, но ===
- строгое равенство, которое лучше для безопасности типов и тому подобное. Дайте знать, если у вас появятся вопросы! Ваш оригинальный код был довольно запутанным, но я надеюсь, что прояснил некоторые понятия.