如何在函数内部使用赋值变量,在函数之外
How to use the assigned variable inside of a function, out of it,
我使用的是Webdriverjs。我想在函数中分配一个变量,然后使用该结果与我从csv文件中检索到的一些数据进行比较。如果我想在从网页中读取元素的函数中比较这两个,那么来自csv的数据的值将是数组中的最后一项。如果我想在函数外部使用函数的结果并将其与来自csv的数据进行比较,那么包含函数(textValue)结果的变量(pageProductName)将是未定义的,即使我在函数外部(全局)定义了变量。我能做些什么来使用函数外的textValue的值?或我能做些什么让从csv中检索到的数据在函数中的正确顺序?这是我的代码的一部分,我有问题:
reader.addListener('data', function(data){
allEntries.push(data);
});
reader.addListener('end', function(end)
{ var i=0;
console.log(allEntries.length);
for(var j=0; j<allEntries.length;j++)
{
ProductURLArray[i]=(BaseURL+allEntries[j]['col3']+".html");
ProductNameArray[i]=allEntries[j]['col2'];
var url = ProductURLArray[i];
var name = ProductNameArray[i];
driver.get(url);
driver.sleep(3000);
driver.findElement(webdriver.By.css('.product-name h1')).getText().then(function(textValue){
pageProductName=textValue;
});
console.log(pageProductName);
assert.equal(pageProductName, name);
}
});
变量赋值在promise中,promise将在将来的某个时刻解决,而不一定在调用时解决。
这个原理和为什么getText()调用不返回函数中的变量以及为什么你必须链接一个承诺来对该值进行操作是一样的。
你需要链接另一个'then'调用,以保证在赋值后对值进行操作。在这种情况下,最好使用给定值来解析promise,而不是使用全局变量。
由于getText().then
承诺,您的pageProductName将不会被分配,直到函数退出后的某个时间。此外,for循环使测试复杂化(我假设这是一个单元测试),因为所有这些承诺都需要在此单个测试完成之前完成。
在不知道测试框架细节的情况下,这有点棘手,但如果它提供了一个设置机制(类似于mocha的before
),那么你应该将CSV读取移到其中(注意,如果CSV包含静态测试数据,那么直接在测试中声明它,使生活变得容易得多)。最后需要注意的是,您需要使用异步测试,因为您的测试将在代码完全完成执行(承诺)之前退出。看看mocha如何通过向每个测试传递done
回调参数来实现这一点。
所以下面是一个通用的代码方法,你所追求的,但可能不是你需要的解决方案;)
d = webdriver.promise.defer();
d.then(function(items) {
return webdriver.promise.map(items, function(item) {
var url = BaseURL + item['col3'] + ".html";
var name = item['col2'];
driver.get(url);
return driver
.findElement(webdriver.By.css('.product-name h1'))
.getText()
.then(function (text) { return webdriver.promise.fulfilled(text === name); });
});
})
.then(function (arr) { assert.equal(arr.every(function(item) { return item === true; }), true); })
.then(function () { done(); });
var reader = // get your reader
var allEntries = [];
reader.addListener('data', function (data) { allEntries.push(); });
reader.addListener('end', function () { d.fulfill(allEntries); });
我刚刚使用了一个文本编辑器,所以要注意它可能需要"修复"。
上面代码的快速解释:
- 我创建了一个承诺(尚未解决)
- 我链接一个承诺,将
- 对传入数组的每个元素执行测试
- 映射函数返回一个承诺,其中包含您所追求的比较结果
- 我链接一个承诺,然后断言所有比较都为真
- 链接一个执行异步完成回调的承诺(实现将取决于测试框架,这就是mocha的做法)
- 注意此时还没有代码运行
- 我已经添加了你的代码,读取你的输入数据,现在解决
d
承诺一旦它有所有的数据
我希望以上是清楚的,如果你有什么不确定的,请告诉我。
没有初始化变量。为了能够使用它,您必须首先初始化您的全局变量。像这样的东西会有帮助
var pageProductName = null;
driver.findElement(webdriver.By.css('.product-name h1')).getText().then(function(textValue){
pageProductName=textValue;
});
console.log(pageProductName.toString());
- 访问嵌套函数结构中的JavaScript父函数变量
- Javascript函数变量传递语法问题
- JavaScript 函数变量范围问题
- 在 promise 中获取构造函数变量
- 将函数结果传递给Javascript中的另一个函数变量
- 用对象设置函数变量's值
- Javascript函数变量应生成错误,而不是未定义的错误
- 我可以访问用户脚本中的匿名函数变量吗?
- 在实例化期间使用构造函数变量
- 为什么在 JavaScript 中不能用函数变量覆盖字符串变量
- JavaScript 允许调用函数访问调用函数变量
- 如何在嵌套原型中访问 JavaScript 构造函数变量
- 对函数变量的 JavaScript 控制台日志输出感到困惑
- 如何将函数变量传递给主干模型上的 jQuery 事件
- 如何访问构造函数变量
- 实例函数变量不会更改
- 为什么函数变量在变量之后是未定义的
- 用内部函数变量更改外部函数变量?Javascript
- Javascript - 使用闭包递增静态函数变量模拟
- 异步 JavaScript 静态函数变量