不能使用超出承诺的价值

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
});

换句话说,操作和传递承诺。每当您需要实际价值时 - 解决。

另见: