javascript - 如何使用闭包在循环中使用 then()

标签 javascript loops closures promise protractor

这个问题与 Using protractor with loops 中提出的问题非常接近但如果有微小的差异,我仍然没有解决。

// This script should print button names and its current numbers
var buttons = element.all(by.css('button'));
buttons.count().then(function(cnt){
  for(var i=0;i<cnt;i++) {
    var func = function(i2){ var k=i2; return function(){console.log("#"+k+", name: "+button_name);}}(i);
    buttons.get(i).getText().then(func);
  }
});

编译器说“ReferenceError: button_name is not defined”是对的。 如何在 then() 函数中传递按钮名称?

最佳答案

您正在获取函数名称作为您的 then 回调的参数 - 但目前您的 func 没有参数。如果你给它一个,它就会起作用:

for (var i=0; i<cnt; i++) {
    var func = function(k) { 
        return function(button_name) {
//                      ^^^^^^^^^^^
            console.log("#"+k+", name: "+button_name);
        };
    }(i);
    buttons.get(i).getText().then(func);
}

或者可能没有从 IEFE 返回,更常见的模式可能是:

for (var i=0; i<cnt; i++) (function(k) {
    buttons.get(k).getText().then(function(button_name) {
//                                         ^^^^^^^^^^^
        console.log("#"+k+", name: "+button_name);
    });
}(i));

免责声明:我并不是说这是使用 protactor 的最佳方式,这只是 promise 和闭包的工作方式。我希望 Protractor 实际上提供一种迭代方法 - @finspin 似乎已经使用过它。

关于javascript - 如何使用闭包在循环中使用 then(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380165/

相关文章:

c - 错误: expected primary-expression before '>' token

Javascript 文本幻灯片

java - 在循环内声明新变量如何不会出错?

C# - 关闭 - 澄清

c# - Java 中的 Lambda 表达式?

javascript - JQuery Packery 的中心容器?

javascript - typescript 中上下文变量的典型化

javascript - 将下拉列表值从 View 传递到 Controller

swift - 如何实现 Apple 核心数据文档中显示的完成处理程序?

javascript - 如何在不知道 javascript 中的 id/class/tag 的情况下分配给 HTML 元素?