2016-07-27 152 views
2

我有兩個功能:Ionic 2/Angular 2中的承諾,如何?

this.geQuizStorage(); 
this.getQuizData(); 

geQuizStorage() { 
    this.quizStorage.getAnswers().then(data => { 
     return data; 
    }); 
} 

getQuizData() { 
    this.quizData.getQuiz().then(data => { 
     return data; 
    }); 
} 

我試圖用承諾的2個功能,等到雙方都做了,是這樣的:

http.when(this.geQuizStorage(), this.getQuizData()).when(data => { 
    // data[0] first function response 
    // data[1] 
}) 

任何想法如何做到這一點的離子2/Angular 2

回答

5

你可以用ES6承諾的all函數來做到這一點。不需要外部庫。

Promise.all([this.geQuizStorage(), this.getQuizData()]).then(data => { 
    //do stuff with data[0], data[1] 
}); 

你的職能應該爲了這個返回承諾的工作,所以我建議作以下修改:

geQuizStorage() { 
    return this.quizStorage.getAnswers().then(data => { 
     return data; 
    }); 
} 

getQuizData() { 
    return this.quizData.getQuiz().then(data => { 
     return data; 
    }); 
} 
+0

不要我需要解決一些承諾並返回它在我的2個功能? – Patrioticcow

+0

我錯過了你的函數沒有返回承諾的地方......但是你需要的只是讓getQuizStorage和getQuizData返回承諾。在調用服務函數之前,可以通過添加'return'來輕鬆完成。見編輯的答案。 – yarons

+0

你可以讓他們返回數據嗎? –

3

基本上你不需要爲你的服務調用創建另一個包裝函數,只是爲了返回一個數據(除非你有驗證邏輯來​​驗證數據)。然後通過傳遞方法promises/observable's & subscribe將這兩個函數傳遞給Observable.forkJoin,以等待那些可觀察到的內容,直到那些完成。

Observable.forkJoin([this.getQuizData(),this.geQuizStorage()]) 
    .subscribe(data => { 
    console.log(data[0], data[1]); 
    //both call succeeded 
});