2017-06-30 10 views
0

私は1つのHttpClientサービスを持っています。これは、すべての残りの呼び出しを処理します。 残りの呼び出しを行う前に、iframeをロードしてから同じ関数呼び出しを続けます。ここで値を返す前に他のイベントが完了するのを待つ方法

public get(url, searchParams: URLSearchParams = new URLSearchParams(), headers: Headers = new Headers()) { 
    if (some condition) { 
    let iframe = this.createIframe(); 
    return new Promise((resolve) => 
     setTimeout(() => { 
     iframe.parentNode.removeChild(iframe); 
     resolve(this.doGET(url, this.getOptions(searchParams, headers))); 
    }, this.time_delay)); 
    } else { 
    return this.doGET(url, this.getOptions(searchParams, headers)); 
    } 
} 

createIframe方法である:

ここ
private createIframe() { 
    let iframe = document.createElement('iframe'); 
    iframe.style.display = 'none'; 
    this.createSomeUrl('').then(function (url) { 
     iframe.src = url; 
    }); 
    document.body.appendChild(iframe); 
    return iframe; 
} 

、私はsetTimeoutを使用することにより、いくつかの時間のためdoGet()コール待ちを作っていますが、それはiframeが作業を終えている保証を与えるものではありません。その作業を終えるときiframe更新される一つの変数があり

、私はiframeはその変数をチェックすることによって、その仕事を終えていることを知っている、しかし、その時点で約束を返すのを待つかの方法を得る停止することができますか?

+0

$ timeout関数を使用 – Dixit

答えて

1

は、あなたが観測を使用している場合、これは簡単にflatMap()を使用して行うことができ

private checkSomeConditions(): Promise { 
    return new Promise(resolve => { 
     if (some condition) { 
      let iframe = this.createIframe(); 

      // Assuming the iframe is closing after the job is done 
      iframe.onbeforeunload(_ => { 
       console.log('iframe is closing'); 
       resolve(); 
      }); 
     } else resolve(); 
    }); 
} 

public get(url, searchParams: URLSearchParams = new URLSearchParams(), headers: Headers = new Headers()) { 
    return this.checkSomeConditions() 
    .then(_ -> { 
     return this.doGET(url, this.getOptions(searchParams, headers); 
    }) 
    [...] 
} 
+2

あなたがSOの質問に答えるときには、単にコードを投稿するのではなく、あなたがしていることを説明する必要があります。それは質問者が将来を理解するのに役立つ可能性が高いです。 – Duncan

+0

あなたの助けに感謝しますが、ここではタイムアウトを避けようとしていますが、iframeがdoGetを呼び出す前にその作業を完了したことを確認したいと思います。 –

+0

Wooops。あなたの質問を完全に間違って読んで、申し訳ありません。タイムアウトを使用する代わりに、必要に応じてiframeで発生したイベントを聴くことができます(例:iframe.onload = function(){// Loaded})。仕事が終わった後iframeが閉じると仮定すると、 'onbeforeunload'も聞くことができます。あなたの助けを借りて私の答え –

0

を編集:

public get(url, searchParams: URLSearchParams = new URLSearchParams(), headers: Headers = new Headers()) { 
    if (somecondition) { 
     let iframe = this.createIframe(); 

     return Observable 
      .delay(this.time_delay) 
      .flatMap(() => { 
       iframe.parentNode.removeChild(iframe); 
       return this.doGET(url, this.getOptions(searchParams, headers)); 
      }) 
    } 
    else { 
     return this.doGET(url, this.getOptions(searchParams, headers)); 
    } 
} 

あなた.get()方法に加入したときに今、それはsomeCondition場合が遅れますそれ以外の場合はtrueを返します。

+0

を編集するが、ここで私は時間の遅れを避けるために努力している、私はiframeがdoGetの呼び出しを行う前に仕事を終えていることを確認したい。 –

関連する問題