2016-09-29 8 views
0

Ich habe drei Funktionen. Die Aufrufhierarchie ist wie folgt:Warten auf das Ende einer Funktion vor dem Fortfahren?

function a() { 
    b(); 
    c(); 
} 

function b() { 
    d(); 
} 

Was ich will, ist zu beenden b dann tun c fortzusetzen. Aber d ist asynchron. Ich habe kein Recht, etwas in b und d zu ändern. Gibt es eine Möglichkeit, mit diesem Fall umzugehen? Entschuldigung für mein Englisch.

+6

Ich denke, wir brauchen ein bisschen mehr Details über das Problem. Nimmt 'd()' eine Callback-Funktion an? Gibt 'd()' ein Versprechen zurück, an das Sie ketten können? – mc10

+0

Sie können "Callbacks" oder bevorzugte Option "Versprechen" überprüfen – Rajesh

+0

Wenn "d" async ist, kann ich sagen, dass fast async Funktionen Callback-Funktion annehmen. Wenn Sie wissen, was 'd' macht, wäre es einfacher zu helfen. – choz

Antwort

4

Fast sicher nicht. Sie benötigen einen Rückruf, ein Versprechen oder ein Ereignis.

Da Sie nicht b() ändern können, können Sie keinen Rückruf Argument d() hinzufügen (vorausgesetzt, es ein an erster Stelle akzeptiert), und Sie können den Rückgabewert von d() nicht erfassen (vorausgesetzt, es ein Versprechen zurück in den ersten Platz).

Wir haben keine Möglichkeit zu sagen, ob d() ein Ereignis im DOM auslöst, wenn es fertig ist (oder sogar wenn Sie das JS in einem Kontext ausführen, in dem es ein DOM gibt).

+0

Können Sie einen Rückruf hinzufügen, wenn Sie b anrufen? – Tom

+0

@Tom - Nein. Er übergibt keine Argumente an 'd()' – Quentin

-1

Es gibt zwei einfache Möglichkeiten, wie Sie Anrufe im Allgemeinen synchronisieren können. Zunächst Funktion b kann ein Versprechen zurück:

function a() { 
    b().then(c); 
} 

function b() { 
    return new Promise(d); 
} 

Zweitens können Sie einen Rückruf verwenden:

function a() { 
    b(c); 
} 

function b(afterCallback) { 
    d(); 
    afterCallback(); 
} 

In diesem Fall, da Sie nicht in der Lage sind, die tatsächlichen b oder d-Funktionen zu ändern, Ich würde einfach eine neue Funktion schreiben, die eine der obigen Methoden implementiert und sie anstelle von b verwendet.

+1

Sie haben 'b' in beiden Fällen geändert. Die Frage besagt, dass das nicht erlaubt ist. – Quentin

Verwandte Themen