Javascript не анализирует массив, переданный через функцию

У меня есть массив, который передается через функцию с использованием 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.

Есть ли у кого идеи?

NB: У меня нет опыта работы с кипарисом, но я не понимаю, почему ваша вторая функция - это async, а внутри нее есть await. Все эти действия явно синхронны, поэтому для async/await это не совсем то.

trincot 02.12.2018 22:50

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

mvoase 03.12.2018 09:33

Кроме того, ваша первая функция ничего не возвращает. Это предназначено? Соответствует ли эта функция заданному вами вопросу? Я имею в виду: вы можете (для целей отладки) просто инициализировать tData каким-нибудь жестко запрограммированным массивом в качестве первой строки в parseData. Тогда у вас все еще есть проблема?

trincot 03.12.2018 09:48

Интересная вещь ... вы вводите приведенный выше код в консоль веб-браузера и бац ... он работает как задумано.

mvoase 03.12.2018 10:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На данный момент я буду считать, что вы хорошо получаете свои данные в массиве. бывший. 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().

user8745435 03.12.2018 21:36

Трудно понять, с чего начать. Целью cy.get() является тестирование элементов DOM, но, похоже, там нет никаких тестов. Это работает, потому что Cypress имеет встроенный jquery-lite, но если вы вместо этого используете jquery или даже document.querySelectorAll(), вы, вероятно, устранили бы асинхронный характер функции.

user8745435 03.12.2018 21:53

Если кому-то еще придется изменить или поддерживать это в будущем, он потратит немало времени на выяснение этого. Код синтаксического анализа должен быть отделен от кода тестирования, если вы хотите создать хорошо сформированный набор тестов.

user8745435 03.12.2018 21:55

Я полностью понимаю, о чем вы говорите, но сейчас все работает нормально. Также мы хотели бы сохранить согласованность тестовой среды и использовать cy для взаимодействия с элементами DOM, а также использовать их для тестирования, мы не чувствовали необходимости взаимодействовать с конкретным элементом div с помощью документа, когда элементы до него запрашиваются с помощью сам сай.

mvoase 03.12.2018 21:56

Хорошо, честно, я в основном хотел поднять красный флаг на случай, если кто-то другой скопирует это.

user8745435 03.12.2018 21:58

Могу я еще спросить, а без async / await работает, они вроде не нужны.

user8745435 03.12.2018 22:00

@ eric99 код синтаксического анализа отделен, это была начальная отправная точка для достижения нужной нам функциональности, я ценю ваш вклад, правда, но я не знаю, почему простой вопрос, на который мы нашли ответ, исчез и переработан превратил вас в предположения относительно нашего набора тестов?

mvoase 03.12.2018 22:01

@ eric99 работает, без чего мы сегодня провели рефакторинг. Просто был занят, поэтому не обновил ответ

mvoase 03.12.2018 22:02

Я также считаю, что никто не должен ничего копировать отсюда, они должны брать идеи и адаптироваться к своему собственному сценарию.

mvoase 03.12.2018 22:03

Другие вопросы по теме