2017-11-17 10 views
-1

줄마다 한 줄씩 실행되는 생성자에서 약속 함수를 만들고 결과가 다음 줄로 나갈 때까지 기다릴 수 있습니까? 현재 내 약속 기능이 실행되지 않고 마지막으로 실행됩니다. 위의이오닉 3 생성자에서 약속 할 fun을 만듭니다.

constructor(){ 
    console.log("Start"); 
    this.getData(); 
    console.log("End"); 
} 

getData() { 
    return new Promise(data => { 
    this.db.database.ref().child('/category').orderByChild('parent_id'). 
     equalTo(this.idn).once('value').then(function (snapshot) { 
     console.log("Mid") 
     }) 
    }); 
} 

출력 GetData의 기능이, 약속을 반환이를 해결과

constructor(){ 
    console.log("Start"); 
    this.getData().then(function (snapshot) {    
     console.log("End"); 
    }) 
} 

답변

2

입니다 명확히하기 위해 약속 함수가 마지막으로 실행되지 않습니다. "시작"다음에 시작하고 "끝"전에 예상대로 시작됩니다. 은 마지막으로 완료됩니다.. 이는 디자인 상 "비동기"호출이기 때문입니다. (Async == non-blocking은 프로그램이 끝내기를 기다리지 않는다는 것을 의미합니다.) 예를 들어 다음 문장 인 console.log ("End")로 넘어갑니다.

Ctor의 "getData()"는 좋지 않습니다. ngOnInit()과 같은 Angular lifecycle 메서드를 사용하는 것이 좋습니다.

4

내부의 콘솔을 넣어 때문에

Start 
End 
Mid 

예상 출력

Start 
Mid 
End 
+0

프로그램이 먼저 완료 될 때까지 기다리는 방법이 있습니까? –

+0

".then()"방법은 다른 답변에서 제시하는 것과 같습니다. 귀하의 예제에서 데이터가 페치 된 이후에 일어날 일은 반드시 .then() 메소드를 사용하여 수행해야합니다. – realharry

+0

실제로 내 주요 문제는'then()'메소드에서'this.key = 2; '와 같은 값을 할당 할 수 없다는 것이므로 오류가 발생하여 프로그램 대기를 게시하는 이유입니다. –

1

생성자에서 getData() 메서드를 호출하는 것이 좋지 않습니다. &은 앱 성능에 해를 끼칩니다. 이온 대신에 ionViewDidLoad을 사용하는 것이 좋습니다. 이것은 거의 모든 경우에 필요한 것입니다.

ionViewDidLoad(){ 
    console.log("Start"); 
    this.getData(); 
} 

getData() { 
    return new Promise(data => { 
    this.db.database.ref().child('/category').orderByChild('parent_id'). 
     equalTo(this.idn).once('value').then(function (snapshot) { 
     console.log("Mid"), 
     //put the code you want to execute after Mid here 
     console.log("End"); 

     }) 
    }); 
}