У меня есть массив, который передается через функцию с использованием javascript, я не вижу ничего плохого в коде, но он не передает правильно первый массив, чтобы его можно было проанализировать.
Идея состоит в том, что первый массив состоит из 56 элементов, затем он вызывает функцию parseData, которая должна разбить этот массив на куски по 7.
Вот две функции:
static async validateRowValues() {
let data = [];
await cy.get('tr > td > div.dlCell')
.each(function (row) {
let d = row.get(0).innerText;
data.push(d);
});
console.info(data);
let response = await this.parseData(data);
console.info({response});
}
static async parseData(tData) {
console.info(tData);
let array = [];
let coll_array = [];
debugger;
await tData.forEach(async (v, index) => {
await array.push(v);
if (index % 6 === 0 && index !== 0) {
await coll_array.push(array);
array = [];
}
});
return coll_array;
}
Первый console.info в parseData действительно возвращает 56 элементов, однако к тому времени, когда он достигает tData.forEach, он полностью теряет свои данные, и синтаксический анализ возвращает пустой массив, когда он возвращает coll_array.
Есть ли у кого идеи?
Я попытался настроить код, чтобы вторая функция не была асинхронной / ожидающей, но все еще не отражала результат синтаксического анализа.
Кроме того, ваша первая функция ничего не возвращает. Это предназначено? Соответствует ли эта функция заданному вами вопросу? Я имею в виду: вы можете (для целей отладки) просто инициализировать tData каким-нибудь жестко запрограммированным массивом в качестве первой строки в parseData. Тогда у вас все еще есть проблема?
Интересная вещь ... вы вводите приведенный выше код в консоль веб-браузера и бац ... он работает как задумано.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На данный момент я буду считать, что вы хорошо получаете свои данные в массиве. бывший. arr = [1,2,3, ..... 58]
Используйте приведенный ниже код, чтобы разделить на куски по 7
arr = arr.reduce((acc,data,index)=>{
if (index==0 || index%7==0) acc.push([])
acc[acc.length-1].push(data)
return acc
},[])
Приведенный выше код вернет
arr = [ [1,..,7], [8,...14], ....]
Мы решили это. Оказывается, все в Cypress - это обещание, поэтому первая функция должна иметь .then
static async validateRowValues() {
let data = [];
await cy.get('tr > td > div.dlCell')
.each(function (row) {
let d = row.get(0).innerText;
data.push(d);
}).then(() => {
this.parseData(data);
});
}
Это в значительной степени неправильное использование cy.get().
Трудно понять, с чего начать. Целью cy.get() является тестирование элементов DOM, но, похоже, там нет никаких тестов. Это работает, потому что Cypress имеет встроенный jquery-lite, но если вы вместо этого используете jquery или даже document.querySelectorAll(), вы, вероятно, устранили бы асинхронный характер функции.
Если кому-то еще придется изменить или поддерживать это в будущем, он потратит немало времени на выяснение этого. Код синтаксического анализа должен быть отделен от кода тестирования, если вы хотите создать хорошо сформированный набор тестов.
Я полностью понимаю, о чем вы говорите, но сейчас все работает нормально. Также мы хотели бы сохранить согласованность тестовой среды и использовать cy для взаимодействия с элементами DOM, а также использовать их для тестирования, мы не чувствовали необходимости взаимодействовать с конкретным элементом div с помощью документа, когда элементы до него запрашиваются с помощью сам сай.
Хорошо, честно, я в основном хотел поднять красный флаг на случай, если кто-то другой скопирует это.
Могу я еще спросить, а без async / await работает, они вроде не нужны.
@ eric99 код синтаксического анализа отделен, это была начальная отправная точка для достижения нужной нам функциональности, я ценю ваш вклад, правда, но я не знаю, почему простой вопрос, на который мы нашли ответ, исчез и переработан превратил вас в предположения относительно нашего набора тестов?
@ eric99 работает, без чего мы сегодня провели рефакторинг. Просто был занят, поэтому не обновил ответ
Я также считаю, что никто не должен ничего копировать отсюда, они должны брать идеи и адаптироваться к своему собственному сценарию.
NB: У меня нет опыта работы с кипарисом, но я не понимаю, почему ваша вторая функция - это
async, а внутри нее естьawait. Все эти действия явно синхронны, поэтому дляasync/awaitэто не совсем то.