【问题标题】:Javascript not parsing array passed over through functionJavascript不解析通过函数传递的数组
【发布时间】:2018-12-02 19:46:01
【问题描述】:

我有一个使用 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.log(data);

    let response = await this.parseData(data);

    console.log({response});
}

static async parseData(tData) {
    console.log(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;
}

parseData 中的第一个 console.log 确实返回了 56 个项目,但是当它到达 tData.forEach 时它已经完全丢失了它的数据,并且当它返回 coll_array 时解析返回一个空数组。

如果有人有任何想法?

【问题讨论】:

  • 注意:我没有使用 cypress 的经验,但我不明白为什么你的第二个函数是 async 并且里面有 await。所有这些动作显然是同步的,所以对于async/await 来说并不是什么。
  • 我已经尝试调整代码以使第二个函数不是异步/等待,但仍然没有反映解析的结果。
  • 另外,您的第一个函数不会返回任何内容。这是故意的吗?该功能与您提出的问题相关吗?我的意思是:您可以(出于调试目的)将tData 初始化为某个硬编码数组作为parseData 的第一行。那你还有问题吗?
  • 有趣的是..您将上面的代码输入到网络浏览器的控制台中然后砰...它按预期工作。

标签: javascript arrays node.js cypress


【解决方案1】:

到目前为止,我认为您可以在数组中很好地获取数据。 前任。 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], ....]

【讨论】:

    【解决方案2】:

    我们已经解决了这个问题。 事实证明,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 元素交互并使用它们进行测试,当查询之前的元素时,我们认为没有必要使用 document 与特定的 div 元素交互cy 本身。
    • 好吧,很公平,我主要是想举起危险信号,以防其他人抄袭。
    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2013-04-14
    • 2021-10-18
    • 2011-11-13
    • 2012-10-01
    • 2016-08-18
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多