2017-04-15 94 views
0

擴大陣列我很新的RxJs,需要一些幫助瞭解如何使這項工作:RxJs從承諾

let myObs= Observable.fromPromise(this.storage.get('storageKeyForArray')) 
    .map(a=>Observable.from(a)) //does this blow up if array is null? 
    .map(e=>doSomethingWithElement(e)) //flatMap? 
    ... 
    ; 

    myObs.first().subscribe((initializedArray) => { 
     this.stuff= initializedArray; 
     this.initialized = true; 
    }); 

這就是我想要做的事:

  1. 負荷從localStorage的陣列
  2. 執行異步查找爲數組的每個元素
  3. 等待所有元件查找完成
  4. 結合回到(現在已經完全初始化)陣列
  5. 數組(這可以隨時隨地的第一步之後進行)排序

回答

1

你需要的東西是這樣的:

Observable.fromPromise(asyncLoadArrayOperation()) 
    .flatMap(x => Observable.from(x)) 
    .flatMap(x => someAsyncFunction(x)) 
    .toArray() 
    .subscribe(x => ...) 

flatMap(X =>可觀測.from(x)) - 假設x是一個數組,Observable.from返回一個逐一發出數組項的Observable。 flatMap操作符將使這個Observable變平,也就是說,下一個操作符將獲得項目,而不是項目的Observable(如果使用'map')。

flatMap(x => someAsyncFunction(x)) - 在這種情況下,flatMap用於獲取someAsyncFunction承諾執行結果。同樣,如果你使用'地圖',它會發出一個承諾。

toArray() - 此操作符收集所有項目,直到源Observable完成,然後發出一個項目 - 所有項目的數組。