0

각도 변경 및 템플릿 업데이트를 이해하려고합니다. 나는 사실 조금 혼란 스럽다.각도 변경 감지 및 비동기 기능 이해

버튼과 간단한 입력 필드가 있습니다. 버튼을 클릭하면 필자는 입력 필드의 값을 "테스트"로 변경합니다. 그런 다음 즉시 반환하는 비동기 함수를 만듭니다. 그런 다음 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 루프가 있는지 확실하지 않습니다. 제 생각에는 루프가 당신이 기다리고있는 것입니다. –

+1

비동기 호출은 현재 컨텍스트의 모든 항목이 완료된 후에 만 ​​항상 * 해결됩니다. get이 "to-do list"에 추가되면 나머지 목록은 그 목록이 다음 항목을 확인하기 전에 실행됩니다. 이는 제목 값이 실제로 설정되면 예상대로 실행되는 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은 호출 될 때 asyncTestFunction이 실행되고 즉시 응답을 받지만 updateField() 함수가 exection을 종료하면 콜백이 실행됩니다. @ Vivek – rematnarab

+0

아니요, API 호출을 수행하지 않습니다. 일반적으로 API 호출이 소요됩니다. 시간은 그 시간에 각도가 작동을 계속하고, API 응답이 도착하면 응답을 받으면 구독 내 코드를 실행합니다 (No. 7) –

+0

for 루프가 30 초 동안 실행되도록 설정합니다. 그리고 서버는 2 초 후에 응답했습니다. 내가 볼 수 있듯이 주문은 여전히 ​​동일합니다 @Vivek – rematnarab