Рекурсивная функция не выполняется в транспортире-огурце - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу заполнить набор данных в компоненте повторителя. Я передаю количество строк, в которых необходимо заполнить данные, а затем передаю данные из json для всех столбцов строки [эти данные будут повторяться в нескольких строках]

Существует функция разбиения на страницы после некоторого набора строк, скажем, 10, а затем мне нужно продолжить ввод данных на последующих страницах после перехода на следующую страницу в повторителе.

Проблемы, с которыми я сталкиваюсь:

  • Передача json в качестве аргумента из определения шага не работает [Пришло передать жестко закодированное значение, я хочу передать rowRepeaterData в _.each]

  • Данные заполняются правильно на первой странице, хотя все обещания работают асинхронно, promise.all ожидает разрешения обещаний. Рекурсивная функция вызывается снова и работает нормально, но promise.all не ждет, а приложение закрывается, пока я не вижу обещаний, которые впоследствии не выполняются, поскольку элементы недоступны.

    this.fillRowRepeaterData= function(rowRepeaterData,rowRepeaterVariable,rows, currentRow) {
        var counter = currentRow,
            //activity=JSON.parse(rowRepeaterData),
            promises = [];
        while (counter < rows) {
            _.each(rowRepeaterJson.individualIncludedExcludedWCApp, function (item) {
                var element = ('.rowRepeater-' + rowRepeaterVariable + ' .' + 'row' + counter + ' .formFieldComponent-' + item.locator);
                promises.push(commonUtilitiesObject.waitFor(by.css(element)).then(function () {
                    console.log('Inside Promise...');
                    if (item.fieldType === 'dropdown') {
                         return formUtil.makeSelectionFromSearchableDropdown(item.value, element);
                    }
                    else if (item.fieldType === 'textInputBox') {
                        return formUtil.sendText(by.css(element), item.value);
                    }
                }))
            });
                counter++;
                if (counter % 10=== 0){
                    break;
                }
        }
         return Promise.all(promises).then(function (resolve) {
            var nextPageButton = '.rowRepeater-' + rowRepeaterVariable + ' .pagingContainer .nextPageButton';
            if (counter < rows){
                commonUtilitiesObject.click(by.css(nextPageButton)).then (function(){
                    this.fillRowRepeaterData(rowRepeaterData, rowRepeaterVariable, rows, counter);
                }.bind(this));
            } else {
                console.log('Final resolve');
                resolve(true);
            }
        }.bind(this));
    }.bind(this);

JSON:
{
    "individualIncludedExcludedWCApp" : [
        {"fieldType":"textInputBox","locator":"locationNumber", "value":1},
        {"fieldType":"textInputBox","locator":"excludedName", "value":"TestRowRepeater"},
        {"fieldType":"textInputBox","locator":"excludedDateOfBirth", "value":"01/01/2018"},
        {"fieldType":"textInputBox","locator":"excludedTitle", "value":"Partner"},
        {"fieldType":"textInputBox","locator":"excludedOwnershipPercentage", "value":50},
        {"fieldType":"textInputBox","locator":"excludedDuties", "value":"Testing of row repeater"},
        {"fieldType":"textInputBox","locator":"excludedRemuneration", "value": 12500}
    ]
}

    this.When(/^user fills data in the "([^"]*)" rows of the "([^"]*)" row repeater$/, function (rowNumber,rowRepeaterVariable){

        var rowsToFillData = rowNumber,
            rowRepeaterData = 'rowRepeaterJson.' +rowRepeaterVariable;
        return rowRepeaterUtil.fillRowRepeaterData(rowRepeaterData,rowRepeaterVariable,rowsToFillData,0);
    });

1 Ответ

0 голосов
/ 02 ноября 2018

У вас отсутствуют возвраты, без которых вызывающая функция fillRowRepeaterData не будет ожидать завершения асинхронного заполнения в promise.all(...).then(...).

if (counter < rows) {
    return commonUtilitiesObject.click(by.css(nextPageButton)).then(function() {
    ^^^^^^
        return this.fillRowRepeaterData(rowRepeaterData, rowRepeaterVariable, rows, counter);
        ^^^^^^
    }.bind(this));
} else {
    ...
}

Кроме того, resolve это нонсенс. Обратный вызов .then() предоставляет данные, а не функцию.

Promise.all(promises).then(function(this_would_be_an_array_of_data_delivered_by_the_promises_passed_to_Promise.all) {...});

resolvereject) предоставляются новым конструктором Promise, но вы (совершенно правильно) не создаете новое Promise.

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