2016-03-23 7 views
-1

Ich bin bei JavaScript codieren.
Ich habe zwei Funktionen func1, func2.
func1 hat keinen Rückgabewert und func2 hat einen Rückgabewert.
Rufen Sie eine Funktion2 auf, nachdem Funktion1 bereits beendet ist

function outFunc(){ 
    func1(); 
    val = func2(); 
    return val; 
} 

func1 hat im Innern eines asynchronen Betrieb.
Wie kann ich sicherstellen, dass func2 nur aufgerufen wird, nachdem func1 abgeschlossen wurde?

+1

hat func1 einen asynchronen Betrieb? – gurvinder372

+1

Wenn Sie keine asynchronen Aufrufe in 'func1' haben, funktioniert das standardmäßig so, wie Sie es möchten. –

+0

ja, func1 hat einen asynchronen Betrieb. –

Antwort

1

Sie können keinen Wert von func2 zurückgeben. Ihr outFunc wird auch einen Callback-Handler haben, wenn Sie den Wert func2 außerhalb verwenden möchten.

function outFunc(finalCallback){ 
    func1(func2,finalCallback); 
} 

function func1(callback, finalCallback) 
{ 
//once the asynch operation has finished 
callback(finalCallback); 
} 

function func2(finalCallback) 
{ 
    //compute return-value 
    finalCallback(return-value); 
} 
1

Der Code wird immer in der Reihenfolge ausgeführt, in der er verarbeitet wird.

jedoch, wenn func1intern ist einen asynchronen Vorgang durchgeführt wird, dann das wird etwas außerhalb des Codes aufzurufen, die nicht sofort zurück. func1selbst wird abgeschlossen, aber die Operation möglicherweise nicht.

In diesem Fall sollte func1 als Funktionsparameter einen Rückruf verfügbar machen. Welche intern func1strukturell wäre, intuitiv ähnlich wie diese:

function func1(callback) { 

    // do some stuff 

    callback(); 

} 

nun in do some stuff würde es asynchrone Operationen sein, die den gleichen Nachteil haben, so würde func1 haben die Verantwortung, die entlang der callback in geeigneter Weise in diese Operationen nach Bedarf. Die Struktur hängt davon ab, was diese Operationen wirklich sind.

Aber der Punkt ist, dass jede Funktion, die eine asynchrone Operation ausführt, einen Rückruf offen legen sollte nach Abschluss dieser Operation aufgerufen werden. Dann würden Sie es als verwenden:

func1(func2); 

ist jedoch zu beachten, dass Sie in laufen ein anderes Problem hier. Da func1 asynchron ist, gilt dies auch für outFunc. Was bedeutet, das wird nicht funktionieren:

return val; 

outFunc vor dem asynchronen Vorgang abgeschlossen wird (n) abgeschlossen. Also wird nichts von Wert zurückgegeben werden. Es gibt einige sehr gute eingehende Erklärungen zu this highly-linked question. Aber im Wesentlichen müssen Sie darüber nachdenken, wie Sie Ihren Code strukturieren. Und das konstruierte Beispiel in der Frage eignet sich nicht wirklich dazu.

Anstatt Werte zurückgeben, müssen Sie bieten Rückrufe. Der Code, der normalerweise den zurückgegebenen Wert zum Ausführen einer Operation verwenden würde, würde stattdessen in den Rückruf versetzt und diese Operation zu einem späteren Zeitpunkt ausführen, wenn der Wert verfügbar wird.

Verwandte Themen