打字稿:等待所有承诺

时间:2016-12-13 13:46:55

标签: javascript angular typescript

我的承诺有一个小问题。

这是我的功能:

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]

什么是解决我所有膳食计划然后保存的最好方法?

2 个答案:

答案 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事件),用于收集事件并保存其数据。

这是一个有趣的例子:https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/creating_and_subscribing_to_simple_observable_sequences.html