我的承诺有一个小问题。
这是我的功能:
public generateMealPlanForAWeek(myMealProfile: any, totalCalories:number):Promise<any> {
return new Promise(resolve => {
let mealplan:Array<any> = [];
for (let i = 1; i <= 7; i++) {
this.generateMealPlanForOneDay(myMealProfile, totalCalories).then(data => {
mealplan.push(data); // resolves much later
});
}
resolve(mealplan); // is resolved instant
})
}
我的问题是,“generateMealPlanForOneDay”将在之后的膳食计划本身得到解决。
Mealplan是一系列物品(在这种情况下是用餐)。
当我想保存我的膳食计划时,膳食计划是空的:
this.storage.set('Mealplan', JSON.stringify(mealplan)).then(....) // meal plan is Array[0]
什么是解决我所有膳食计划然后保存的最好方法?
答案 0 :(得分:7)
在这种情况下,您可以使用Promise.all
。
public generateMealPlanForAWeek(myMealProfile: any, totalCalories:number):Promise<any> {
var mealPlans = [];
for (let i = 1; i <= 7; i++) {
mealPlans.push(this.generateMealPlanForOneDay(myMealProfile, totalCalories));
}
return Promise.all(mealPlans);
}
// later
generateMealPlanForAWeek(...).then(mealPlans => ...);
答案 1 :(得分:1)
您可以使用事件流,而不是使用promises。
JavaScript的反应性扩展(RxJS,请参阅https://github.com/ReactiveX/RxJS)可以轻松地对事件流(Observable
及其OnNext
事件)做出反应,或者例如结束事件流(OnCompleted
事件),用于收集事件并保存其数据。