2016-09-29 5 views
0

私は3つの機能を持っています。呼び出し元の階層は次のようにされています継続する前にある関数が終了するのを待つ方法は?

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

function b() { 
    d(); 
} 

私が欲しいのは、Cをやっていき、その後Bを終了することです。しかし、dは非同期です。私はbとdの何かを変更する権利がありません。このケースを処理する方法はありますか?私の英語には申し訳ありません。

+6

問題の詳細がもう少し必要だと思います。 'd()'はコールバック関数を取りますか? 'd()'は連鎖できる約束を返しますか? – mc10

+0

'callbacks'またはpreferredオプション' promise'を確認できます。 – Rajesh

+0

'd'が非同期の場合、ほぼ非同期関数がコールバック関数をとることがわかります。もしあなたが 'd 'が何をしているのか分かるなら、助けが簡単になります。 – choz

答えて

4

ほとんど確かにありません。コールバック、約束、またはイベントが必要です。あなたがb()を変更することはできませんので

、あなたは(それが最初の場所での1を受け入れたと仮定した場合)d()にコールバック引数を追加することはできませんし、あなたはそれがで約束を返されたと仮定すると(d()の戻り値をキャプチャすることはできません最初の場所)。

d()は、DOMのイベントがトリガーされたとき(またはDOMがあるコンテキストでJSを実行している場合でも)、イベントをトリガーするかどうかを知る方法がありません。

+0

bを呼び出すときにコールバックを追加できますか? – Tom

+0

@Tom - いいえ。 'd() 'に引数を渡しません。 – Quentin

-1

通話を同期させるために一般的に使用できる2つの簡単な方法があります。 まず、機能bが約束返すことができます:あなたは、実際のBまたはDの機能を変更することができないとして、この場合、

function a() { 
    b(c); 
} 

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

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

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

第二に、あなたはコールバックを使用することができます上記のメソッドの1つを実装する新しい関数を作成し、bの代わりに使用します。

+1

両方の場合に' b'を修正しました。問題はそれが許可されていないと言います。 – Quentin

関連する問題