2016-08-16 8 views
1

私は、さまざまな選択項目(ここでは車)の情報を検出し、この車両が製品を注文できるかどうかを調べるテストを進めています。期待外の価値を使うことはできません

価格と名の値をすることができ、私は「generalData」オブジェクトにそれを持ってではなく、選択された車両の名前とステータス...

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

答えて

1

に約束.then()ハンドラは、非同期的にいつかLATERと呼ばれています。 .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 

インラインコードが実行されます。


あなたの問題を解決するための1つの可能性が並行して、あなたの2つの操作を実行することです、彼らは両方行われ、その後、.then()ハンドラ内巣あなたのコードの残りの部分をしているときに知ってPromise.all()を使用します。

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

をあなたが私にそれを解決する方法のサンプルをお願いできますか?私はまだこの初心者です... –

+0

@StefanieZachmann - 前回の非同期操作の結果を使用できるように、あなたの約束を縛るか入れ子にする必要があります。ここにいくつかのアイデアがあります:[前の結果を連鎖して約束する方法](http://stackoverflow.com/questions/28714298/how-to-chain-and-share-prior-results-with-promises/28714863#28714863 )。 – jfriend00

+0

それが解決策でした。 :)それは知らなかった:)ありがとう –

1

@jfriend00's explanationは本当に素晴らしいです。言い換えれば

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

、動作し、約束を周りに渡します。それに加えて、ここにあなたが解決し、分度器で特異的に複数の約束を使用する方法の実用的な例です。実際の価値観が必要なときはいつでも解決してください。

も参照してください:

関連する問題