2016-05-13 5 views
0

Ich versuche, den folgenden Code auszuführen:für ein Versprechen Warten zu lösen, bevor Funktion einen Wert zurückgibt

exports.myFunction = function(){ 
    myPromise.doThis().then(ret => { 
    return ret; 
    }); 
} 

Beim Aufruf dieser Funktion es undefined zurückgibt. Wie mache ich die Funktion warten auf das Versprechen zu lösen und dann zurückzukehren.

+0

können Sie nicht. Sie können ihm nur einen Rückruf geben und diesen Callback innerhalb des 'Then'-Aufrufs aufrufen, oder Sie geben ein anderes Versprechen zurück –

+1

In JavaScript können Sie nicht warten, bis eine asynchrone Operation abgeschlossen ist, bevor Sie von Ihrer Funktion zurückkehren. Es funktioniert einfach nicht so. Stattdessen geben Sie das Versprechen zurück und lassen den Aufrufer '.then()' darauf verwenden, um zu wissen, wann das Ergebnis bereit ist. – jfriend00

+1

BTW, '.then (ret => {return ret;});' ist (fast) ein No-Op. –

Antwort

1

Da es sich um ein asynchrones Verfahren handelt, kann nicht garantiert werden, wann das Versprechen gelöst wird. Möglicherweise muss es eine Weile warten (abhängig davon, was Sie tun).

Die typische Art der Ausführung nach einem Versprechen ist die Verkettung der Ausführung oder die Verwendung von Callback-Funktionen.

Als Rückruf

Ihr Beispielcode (für mich) schlägt die Verwendung eines Rückrufes.

exports.myFunction = function(callback){ 
    myPromise.doThis().then(ret => { 
     callback(ret); 
    }); 
} 

Dann würde sich mit ähnlich ist:

var myFunction = require('pathToFile').myFunction; 

myFunction(function(ret){ 
    //Do what's required with ret here 
}); 

bearbeiten:

Wie @torazaburo erwähnt, kann die Funktion in kondensiert werden:

exports.myFunction = function(callback){ 
    myPromise.doThis().then(callback); 
} 

Wie ein Versprechen

exports.myFunction = function(){ 
    //Returnes a promise 
    return myPromise.doThis(); 
} 

Dann mit würde aussehen:

var myFunction = require('pathToFile').myFunction; 

myFunction().then(function(ret){ 
    //Do what's required with ret here 
}); 
+0

Danke, das macht Sinn. – Simar

+2

* vollständig aufgelöst * Versprechen lösen sich nicht ein wenig auf. Sie sind entweder nicht gelöst oder gelöst. Auch Ihre Mischung aus Versprechen und Rückrufen ist ziemlich seltsam. BTW, um zu sagen ". Dann (ret => {callback (ret);})' (warum die unnötigen geschweiften Klammern?) Ist (fast) identisch zu sagen '.then (callback)'. Aber warum schreibe ich eine Funktion, deren einziger Zweck darin besteht, einen asynchronen Aufruf zu machen und ein 'then' von ihr abzulegen, das einen bestimmten Callback aufruft? Lassen Sie den Anrufer stattdessen das 'then' selbst angeben. –

+0

Das ist wahr, sie sind entweder aufgelöst oder nicht. Ich werde meine Antwort überarbeiten, um dies für Klarheit zu entfernen. Sie können auch die 'Callback'-Funktion als direkten Ersatz verwenden und die unnötige Zuweisung von 'ret' entfernen. Ich habe mich bewusst für die ausführliche Methode als Beispiel entschieden. Eine verkleinerte Notation kann oft neue Entwickler verblüffen. – AXRS

Verwandte Themen