2017-06-02 5 views
0

Ich rufe die getText() -Funktion wie folgt und dann versuchen, das Versprechen zu lösen, aber nicht den String-Wert später.Gradmesser Versprechen Auflösung mit GetText()

var textFromElement = someElement.getText().then(function(text){return text}) 
var splittedText = textFromElement.split(" ") 

Wie kann ich den Text bekommen später verwenden?

+1

Mögliches Duplikat [Wie kann ich die Antwort von einem asynchronen Aufruf zurückkehren?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) –

+1

Nicht wirklich, da diese Frage spezifisch für die Winkelmesser-API ist – purplePanda

+1

Werfen Sie einen Blick [hier] (https://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/) und finde den Absatz "Hinter den Kulissen von WebDriver, ...". Beachten Sie nun, wie dieser Absatz endet, "... (es sei denn, wir möchten ausdrücklich, dass das Ergebnis vom Aufruf zurückgegeben wird)". Wenn ich Ihre Absicht nicht völlig falsch interpretiere, ist dieser Vorbehalt der Schlüssel zu meiner Überzeugung, dass mein "mögliches Duplikat ..." hier angebracht ist. –

Antwort

1

Was Sie nicht verstehen, ist, wie die Javascript-Compiler beschäftigt sich mit Versprechungen.

So betrachtet der Compiler Ihren Code;

1 - Alle Variablen werden am Anfang des Funktionsumfangs erstellt, unabhängig davon, wo Sie sie zuweisen.

2 - Ist die minimale Menge Arbeit für jede Zeile verfügbar und wird in die nächste Zeile verschoben.

testFromElement = {promise element object}; 
splittedText = {promise element object}.split(" "); (= undefined)//This what you don't want. 

3 - Beginnt an der Spitze und arbeitet minimal an nicht aufgelösten Zeilen.

testFromElement = {promise getText object}; 

4 - Beginnt an der Spitze und arbeitet minimal an nicht aufgelösten Zeilen.

Kurz gesagt es teilt splitedText drei Schritt, bevor Sie es wollen.

Gutes Beispiel:

var splittedText; 
it("should get split text", function(done) { 
    someElement.getText().then(function(textFromElement){ 
    splittedText = textFromElement.split(" "); 
    done(); 
    }) 
}) 

1 - Alle Variablen sind an der Oberseite des Funktionsumfang erstellt, unabhängig davon, wo Sie es zuweisen.

var splittedText; (= undefined) 

2 - Nur Arbeit, bis getan innerhalb dieser Funktion getan() aufgerufen wird

it("should get split text", function(done) { 

3 - Ist die minimale Menge an Arbeit kann es weg mit für jede Zeile und bewegt sich auf die nächste Linie.

4 - Beginnt an der Spitze der Funktion und arbeitet minimal an nicht aufgelösten Zeilen.

5 - Beginnt an der Spitze der Funktion und arbeitet minimal an nicht aufgelösten Zeilen.

textFromElement = "text text"; 
splittedText = textFromElement.split(" "); (["text","text"]); 
done(); //the compiler can now to work outside this function 
0

Ihr Problem besteht darin, dass Sie Ihrer Variablen die Auflösung der .then() -Methode zuweisen, nicht den Callback, den Sie als Parameter angeben.

Alles in allem kommt Winkelmesser/Jasmin mit Mechanismus für asynchrone Tests.

Hier haben Sie ES6 Beispiel.

it('some description', (done) => { 
    someElement.getText().then(text => { 
     var splittedText = text.split(" "); 
     done(); 
    }); 
}); 

Und ES5:

it('some description', function(done) => { 
    someElement.getText().then(function(text){ 
     var splittedText = text.split(" "); 
    }).finally(done); 
}); 
+0

Mein Code läuft in einer Funktion, die von einer it-Funktion aufgerufen wird, daher weiß ich nicht, wie Ihr Beispiel zutreffen würde. Wenn ich versuche, splittedText außerhalb zu verwenden, bin ich undefined – purplePanda

+0

geworden Und du wirst immer undefiniert werden, solange du versuchst, Werte von asynchronize Code im synchronisierten Abschnitt zu erreichen. Versprechen wird als asynchron gelöst. Wenn Sie den Wert also manipulieren möchten, müssen Sie dies innerhalb des Versprechens-Callbacks tun. Ich habe Ihnen nur ein Beispiel gegeben, wie Sie Ihren Test auf asynchronen Code warten lassen können. –

+0

Vielleicht würden Sie mehr Details/Code zur Verfügung stellen. Dann werde ich den Kontext Ihres Problems sehen. –