0

変更検出とテンプレートの更新をAngularで理解しようとしています。私は実際に少し混乱しています。Angleの変更検出と非同期関数の理解

私はボタンと簡単な入力フィールドを持っています。 ボタンをクリックすると、入力フィールドの値を「テスト」に変更します。その後すぐに戻る非同期関数を作ります。それから、forループ(テスト目的)を使って約4秒待つ。私は何を期待

  • は次のとおりです。入力フィールドの値は、それが非同期呼び出しであるため、すぐに「asynched」になります。
  • リアリティ:入力フィールドの値は4秒後に "asynched"になります。

コード

updateField(){ 
    this.textContentMain.title = "test" 
    this.asyncTestFunction(); 
    for(var i=0;i<3999999999;i++){ 

    } 
    } 

    asyncTestFunction() { 
    this._contentSalesTextConfigService.get(this.contentSalesTextConfig).subscribe(item => { 
     this.textContentMain.title = "asynced"; 
    }) 
    } 

テンプレートここ

<button (click)="updateField()">Update</button> 
<input [ngModel]="textContentMain.title" #titleAccessor="ngModel" name="title" id="title" type="text" > 
+0

私はここで間違っている可能性が、あなたのサイクルをダイジェスト:あなたはシーンの背後にある重要なことを説明することができ イベントループ
見るこの最高のビデオを読まなければならない。このため

関数が実行されるまではおそらく実行されません。あなたの同期関数はあなたのforループとは別のものです。あなたのforループがそこにあるのかどうかわかりません。私の考えでは、forループはあなたが待っているものです。 –

+1

非同期呼び出しは、現在のコンテキスト内のすべてが完了した後にのみ*常に*解決されます。 getが「to-doリスト」に追加され、残りの関数が実行されてから、そのリストが次にチェックされる前に実行されます。これは、タイトル値が実際に設定されたときに期待どおりに動作するAngularの変更検出とは関係ありません。 – jonrsharpe

+0

ありがとう@jonrsharpe – rematnarab

答えて

2

は、実行の流れで、これはすべてのあなたの疑問できるだけ早く

// 1. This function will be called as soon as clicked 
updateField(){ 
    this.textContentMain.title = "test" // 2. changes the value 
    this.asyncTestFunction(); // 3. call async function 
    for(var i=0;i<3999999999;i++){ // 5. start for loop 

    } 
    // 6. end for loop 
} 

asyncTestFunction() { 
    this._contentSalesTextConfigService.get(this.contentSalesTextConfig) // 4. call the http request 
    .subscribe(item => { 
     this.textContentMain.title = "asynced"; // 7. asap response is received and for loop finish its execution this wiil be executed. 
    }) 
} 

なぜ=> 7をクリアする必要があります応答が受信され、forループ実行を終了します これは実行されます。 (なぜ「forループ」が終了するのを待つのですか?)

What the heck is the event loop anyway?

+0

ありがとう、forループはテスト用です。私はいつ何が起こるのかを知ることができます。あなたの応答はとても感謝しています。私が理解するように、asyncTestFunctionは呼び出されたときに実行され、すぐに応答を取得しますが、updateField()関数がそのエクステンションを終了するとコールバックが実行されます.. @ Vivek – rematnarab

+0

これはapiコール時間は、その時間は、応答が受信されると、それはサブスクリプション(No. 7)内のコードを実行します。 –

+0

30秒間実行するためのループセットを言うことができます。サーバーは2秒後に応答しました。私は見ることができるので、注文はまだ同じです@Vivek – rematnarab

関連する問題