2016-12-13 10 views
2

私の約束に少し問題があります。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自体後で、その後解決されていること、です。

Mealplanはオブジェクト(この場合は食事)の配列です。

私は私のmealplanを節約したい、mealplanは空です:

this.storage.set('Mealplan', JSON.stringify(mealplan)).then(....) // meal plan is Array[0] 

いただきました私の食事の計画のすべての食事を解決し、それを保存するための最良の方法?

答えて

5

この場合、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 => ...); 
+0

ありがとう!それはたくさんの助けになりました! – Fargho

1

約束事を扱う代わりに、イベントストリームで作業することもできます。

JavaScriptのための反応性拡張機能は、(RxJSは、https://github.com/ReactiveX/RxJSを参照)を収集するために、イベントストリーム(Observable sおよびその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

+0

音も素晴らしいです!私はそれを試す必要があります!ありがとう! – Fargho

関連する問題