2014-04-09 10 views
47

Ich habe eine JavaScript-Funktion, wo ich den Wert, den ich nach der Rückkehr-Methode erhalten habe, zurückgeben möchte. leichter zu sehen alsRückgabewert nach einem Versprechen

function getValue(file){ 
    var val; 
    lookupValue(file).then(function(res){ 
     val = res.val; 
    } 
    return val; 
} 

zu erklären, was der beste Weg ist, diese mit einem Versprechen zu tun. Wie ich es verstehe, die return val wird zurückkehren, bevor der LookupValue hat es dann getan, aber ich kann nicht return res.val als das ist nur von der inneren Funktion zurück.

+0

@OneKitten, ist die Frage, die Sie verknüpfen nicht mit einem Versprechen, es ist eine Funktion als Callback übergeben, das ist ganz anders, denke ich. – pedalpete

+1

Es ist das gleiche Konzept, Versprechen sind immer noch asynchron. –

+1

http://stackoverflow.com/q/22536385/1348195 –

Antwort

16

Der beste Weg, dies zu tun wäre, um das Versprechen zu verwenden Rückkehr Funktion, wie sie ist, wie diese

lookupValue(file).then(function(res) { 
    // Write the code which depends on the `res.val`, here 
}); 

Die Funktion, die eine asynchrone Funktion aufruft, kann nicht warten, bis die Asynchron-Funktion einen Wert zurückgibt. Denn es ruft nur die Async-Funktion auf und führt den Rest des darin enthaltenen Codes aus. Wenn also eine asynchrone Funktion einen Wert zurückgibt, wird sie nicht von derselben Funktion empfangen, die sie aufgerufen hat.

So ist die allgemeine Idee, den Code zu schreiben, der von dem Rückgabewert einer asynchronen Funktion in der asynchronen Funktion selbst abhängt.

+3

Sie liegen nicht falsch, aber Ihre Lösung verletzt das Einkapselungsprinzip. Das Objekt oder die Funktion, die getValue (...) aufruft, sollte nicht wissen und nicht über die Funktion lookupValue (...) wissen müssen. Auf diese Weise müssen Funktionen, die sich darauf beziehen, nicht aktualisiert werden, wenn sich die genaue Prozedur in getValue (...) ändert. –

13

ein Muster entlang dieser Linien verwenden:

function getValue(file) { 
    return lookupValue(file); 
} 

getValue('myFile.txt').then(function(res) { 
    // do whatever with res here 
}); 

(obwohl dies ein wenig redundant ist, ich bin sicher, dass Ihre eigentliche Code komplizierter ist)