不能使用超出承诺的价值
Cannot use value out of promise
我正在进行一项检测不同 select 条目(此处:车辆)信息的测试,并将检查该车辆是否可以订购产品。
价格和名称的值可以是,我在 "generalData" 对象中有它,但对于 selected 车辆,名称和状态不是...
var TestData = require('./testdata.js');
var TD = new TestData();
var generalData = TD.generalData;
(doing logging, open page)
PDP.elementPrice.getText().then(function (value) {
value = value.replace(/[^0-9\.,-]+/g, "");
generalData.articleData.price = value;
console.log(value);
});
PDP.elementArticleNumber.getText().then(function (value) {
generalData.articleData.number = value;
console.log(value);
});
从这里开始,没有值保存到 GeneralData 对象
PDP.elementCarList.count().then(function (value) {
console.log("Fahrzeuge: " + value);
vehicles = parseInt(value, 16);
for (var car = 0; car < vehicles; ++car) {
console.log(car);
PDP.elementCarList.get(car).getAttribute("data-testid").then(function (value) {
value = value.split("-").pop();
generalData.articleData.fin = value
console.log(value);
});
PDP.selectCar(car);
PDP.elementSelectCar.getText().then(function (value) {
generalData.articleData.vehicle = value;
console.log(value);
}); PDP.elementStatus.getAttribute("class").then(function (value) {
value = value.split("-").pop();
generalData.articleData.status = value;
console.log(value);
});
expect(PDP.elementStatus).toBeDefined();
var options = buildSendOptions(generalData);
request(options, callback);
}
});
承诺 .then()
处理程序在您的其余代码执行后的某个时间异步调用。您可以使用传递给 .then()
处理程序的值的唯一位置是在该处理程序内部,或者在您从该处理程序调用并将数据传递给它的函数中。
您不能像您尝试的那样在 .then()
处理程序之外使用该值。这里有一些解释:
PDP.elementPrice.getText().then(function (value) {
// you must use value here inside this code block, not outside this
value = value.replace(/[^0-9\.,-]+/g, "");
console.log(value);
// this will not do you much good because your code
// will not know when the new price value has been set
generalData.articleData.price = value;
});
// this line of code is executed BEFORE then above .then() handler is called
// as such, you cannot use the value of generalData.articleData.price here
这是一个简单的例子:
console.log("1");
someAsync().then(function(value) {
// this is the only place you can reliably use value
console.log("2");
});
console.log("3");
这将在控制台中显示为:
1
3
2
那是因为异步操作的结果发生在您的其余内联代码执行之后。
解决您的问题的一种可能性是 运行 您的两个操作并行,使用 Promise.all()
知道它们何时完成,然后将其余代码嵌套在.then()
处理程序:
let p1 = PDP.elementPrice.getText().then(function (value) {
value = value.replace(/[^0-9\.,-]+/g, "");
generalData.articleData.price = value;
console.log(value);
});
let p2 = PDP.elementArticleNumber.getText().then(function (value) {
generalData.articleData.number = value;
console.log(value);
});
Promise.all([p1, p2]).then(function() {
// put your code in here that wants to use generalData.articleData
}).catch(function(err) {
// handle error here
});
真的很棒。除此之外,这里还有一个实际示例,说明如何在 Protractor 中具体解决和使用多个 promise:
var p1 = PDP.elementPrice.getText().then(function (value) {
return value.replace(/[^0-9\.,-]+/g, "");
});
var p2 = PDP.elementArticleNumber.getText();
protractor.promise.all([p1, p2]).then(function(values) {
var price = values[0],
number = values[1];
// do something with price and number
});
换句话说,操作和传递承诺。每当您需要实际价值时 - 解决。
另见:
我正在进行一项检测不同 select 条目(此处:车辆)信息的测试,并将检查该车辆是否可以订购产品。
价格和名称的值可以是,我在 "generalData" 对象中有它,但对于 selected 车辆,名称和状态不是...
var TestData = require('./testdata.js');
var TD = new TestData();
var generalData = TD.generalData;
(doing logging, open page)
PDP.elementPrice.getText().then(function (value) {
value = value.replace(/[^0-9\.,-]+/g, "");
generalData.articleData.price = value;
console.log(value);
});
PDP.elementArticleNumber.getText().then(function (value) {
generalData.articleData.number = value;
console.log(value);
});
从这里开始,没有值保存到 GeneralData 对象
PDP.elementCarList.count().then(function (value) {
console.log("Fahrzeuge: " + value);
vehicles = parseInt(value, 16);
for (var car = 0; car < vehicles; ++car) {
console.log(car);
PDP.elementCarList.get(car).getAttribute("data-testid").then(function (value) {
value = value.split("-").pop();
generalData.articleData.fin = value
console.log(value);
});
PDP.selectCar(car);
PDP.elementSelectCar.getText().then(function (value) {
generalData.articleData.vehicle = value;
console.log(value);
}); PDP.elementStatus.getAttribute("class").then(function (value) {
value = value.split("-").pop();
generalData.articleData.status = value;
console.log(value);
});
expect(PDP.elementStatus).toBeDefined();
var options = buildSendOptions(generalData);
request(options, callback);
}
});
承诺 .then()
处理程序在您的其余代码执行后的某个时间异步调用。您可以使用传递给 .then()
处理程序的值的唯一位置是在该处理程序内部,或者在您从该处理程序调用并将数据传递给它的函数中。
您不能像您尝试的那样在 .then()
处理程序之外使用该值。这里有一些解释:
PDP.elementPrice.getText().then(function (value) {
// you must use value here inside this code block, not outside this
value = value.replace(/[^0-9\.,-]+/g, "");
console.log(value);
// this will not do you much good because your code
// will not know when the new price value has been set
generalData.articleData.price = value;
});
// this line of code is executed BEFORE then above .then() handler is called
// as such, you cannot use the value of generalData.articleData.price here
这是一个简单的例子:
console.log("1");
someAsync().then(function(value) {
// this is the only place you can reliably use value
console.log("2");
});
console.log("3");
这将在控制台中显示为:
1
3
2
那是因为异步操作的结果发生在您的其余内联代码执行之后。
解决您的问题的一种可能性是 运行 您的两个操作并行,使用 Promise.all()
知道它们何时完成,然后将其余代码嵌套在.then()
处理程序:
let p1 = PDP.elementPrice.getText().then(function (value) {
value = value.replace(/[^0-9\.,-]+/g, "");
generalData.articleData.price = value;
console.log(value);
});
let p2 = PDP.elementArticleNumber.getText().then(function (value) {
generalData.articleData.number = value;
console.log(value);
});
Promise.all([p1, p2]).then(function() {
// put your code in here that wants to use generalData.articleData
}).catch(function(err) {
// handle error here
});
var p1 = PDP.elementPrice.getText().then(function (value) {
return value.replace(/[^0-9\.,-]+/g, "");
});
var p2 = PDP.elementArticleNumber.getText();
protractor.promise.all([p1, p2]).then(function(values) {
var price = values[0],
number = values[1];
// do something with price and number
});
换句话说,操作和传递承诺。每当您需要实际价值时 - 解决。
另见: