You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript函数内无法更新变量?rows.each()更新rowNumber无效求助

解决Protractor中rows.each()后变量未更新的问题

这是典型的Protractor异步执行特性导致的坑,我来帮你拆解原因和解决办法!

问题根源

Protractor里的element.all()、each()、getText()这些操作全都是异步的,它们返回的是Promise对象,不会阻塞后续同步代码的执行。你之前的写法里,console.log是同步代码,会在rows.each()内部的所有getText().then()回调执行之前就运行,所以此时rowNumber还保持着初始的null值——哪怕你在外层定义变量,也改变不了异步代码的执行顺序。

解决方案

方案1:使用async/await(推荐,代码更易读)

把测试函数改成async函数,用await等待所有异步操作完成,让代码按预期的顺序执行:

var licenceNumber = 233521673;
it('should open created Driver Licence', async function() {
  var rowNumber = null;
  var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index'));
  
  // 用await等待整个each循环执行完毕
  await rows.each(async function(element, index) {
    const rowText = await element.getText();
    // 假设你要匹配licenceNumber来定位行号
    if (rowText.includes(licenceNumber.toString())) {
      rowNumber = index;
      console.log('匹配到目标行,行号:', rowNumber); // 这里能正确输出
    }
  });
  
  // 此时each循环已完成,rowNumber已被赋值
  console.log('最终获取的rowNumber:', rowNumber);
});

方案2:使用Promise链式调用(兼容旧环境)

如果你的环境不支持async/await,可以利用Protractor的Promise机制,把后续代码放在each()返回的Promise的then()回调里,确保异步操作完成后再执行:

var licenceNumber = 233521673;
it('should open created Driver Licence', function() {
  var rowNumber = null;
  var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index'));
  
  // each()会返回一个Promise,当所有内部操作完成后触发then()
  rows.each(function(element, index) {
    // 要返回getText的Promise,确保each等待这个操作完成
    return element.getText().then(function(rowText) {
      if (rowText.includes(licenceNumber.toString())) {
        rowNumber = index;
      }
    });
  }).then(function() {
    // 这里所有行的检查都已完成,rowNumber有值了
    console.log('最终获取的rowNumber:', rowNumber);
  });
});

额外提示

注意在each()内部的回调里,如果有异步操作(比如getText()),一定要返回它的Promise,这样each()才会等待这个操作完成后再处理下一个元素,避免出现漏处理的情况。

内容的提问来源于stack exchange,提问作者LazioTibijczyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:25:46