2017-10-13 1 views
1

Ich bin Anfänger zu Javascript-Konzepten. Warum bekomme ich den unterschiedlichen Ausgang für die gleiche Variable Länge? Während es das erwartete Ergebnis im Körper zeigt?Konnte die Länge nicht

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
console.log("3rd output = "+length);//undefined 

Ausgang: - 1. Ausgang = 1

2. Ausgang = 1

3. Ausgang = undefined

+2

3. ist nicht definiert, da es sich um einen asynchronen Aufruf handelt. –

+1

'.then' arbeitet asynchron zu dem Zeitpunkt, an dem der Code in' .then' die Anweisung 'console.log (" 3rd output = "+ length) ausgeführt hat, seine Ausführung beendet hat & zu diesem Zeitpunkt ist" length "nicht definiert .. Sie können diesen Link überprüfen https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – brk

Antwort

2

Weil Ihr all() async Anruf ist so console.log laufen, bevor Sie then Kette beenden und weisen Sie den Wert length

1

Die element.all(by.className("className")).getText()) Aufruf in Ihrer Funktion gibt etwas zurück, das ein Versprechen genannt wird - es führt etwas Code aus, und nachdem dieser Code ausgeführt wird, ruft er die Funktion innerhalb auf. Dies geschieht jedoch unabhängig vom Rest Ihres Programms - so führt es weiterhin die console.log nach der Anweisung.

Dies führt zu einer sogenannten Racebedingung, bei der die Reihenfolge der Operationen nicht definiert werden kann.

+0

Was soll ich tun, um es zu beheben .As ich möchte die Länge des Artikels. –

+0

@shankarDayalupadhyay Wie wollen Sie die Länge des Artikels verwenden? Gibt es eine Möglichkeit, wie Sie es aus der Synchronfunktion heraus verwenden können? –

+0

Ich möchte die Länge des Artikels draußen vergleichen. –

1

Alle vorherigen Antworten erklären bereits, was passiert und warum. So ist es klar, dass Ihr 3. console.log ausgeführt wird, bevor Ihr then() Zustand endet.

Was können Sie versuchen, ist dies:

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
browser.waitForAngular(); //add this line to let Protractor wait for Async tasks to be resolved first 
console.log("3rd output = "+length); 

jedoch die 3. console.log halten() innerhalb der then() Aussage wäre die geeignetere Lösung sein.

+0

Hallo, Wenn meine Anwendung nicht eckig ist, können wir browser.waitForAngular() verwenden? –

+0

Nein, das wird nicht funktionieren, da 'browser.waitForAngular()' auf winkelspezifischen Objekten verrechnet wird. Ich schlage vor, mit 'async/await' als reiner Javascript-Methode zu gehen. Der Winkelmesser wird sich in den nächsten 12 bis 18 Monaten dorthin bewegen. [Lesen Sie alles über hier] (https://Stackoverflow.com/a/46660193/8683679) –

+0

@shankarDayalupadhyay: Es hat nicht funktioniert oder was war der Grund für die Annahme der Antwort? Ich würde es gerne verbessern, wenn es so sein sollte (wie es scheint, hast du immer noch eine unbeantwortete Frage). –

Verwandte Themen