возвращаемое значение не определено для следующей машинной функции. - PullRequest
0 голосов
/ 07 февраля 2020

Если я вызываю следующую функцию, она возвращает undefined вместо текста столбца. Любая помощь очень ценится

async verifyCreateAuditReport(FieldValue?: string) {

    await this.auditCriteriaReport.all(by.tagName('tr')).then(function (rows) {
        browser.logger.info("Row Count::" + rows.length);
        rows.forEach(function (row: ElementFinder) {
            row.all(by.tagName('td > span')).then(function (cols) {
                browser.logger.info("Column Count::" + cols.length);

                if (cols.length > 0) {
                    cols.forEach(function (col: ElementFinder) {
                        col.getText().then(function (columnText) {
                            if (columnText == FieldValue) {
                                //browser.logger.info("Column Text is::" + columnText);
                                //return Promise.resolve(columnText);
                                return columnText;

                            }
                        });

                    });
                }

            });
        });
    });

}

1 Ответ

0 голосов
/ 07 февраля 2020

Так что я думаю, что вы неправильно понимаете некоторые ключевые концепции 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 это, но === - строгое равенство, которое лучше для безопасности типов и тому подобное. Дайте знать, если у вас появятся вопросы! Ваш оригинальный код был довольно запутанным, но я надеюсь, что прояснил некоторые понятия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...