2017-02-18 4 views
1

Я пытаюсь узнать и понять Rxjs и ngrx/магазинУглового 2 ngrx/магазин вызова наблюдаемого вызова службы на результате другого наблюдаемого вызова службы

У меня есть два API вызовов, первая получает мне массив имен символов, второй - мне инвентарь персонажа.

Как запустить вторую функцию через массив, возвращенный первым, используя ngrx/store action/reducers/effects?

Это являются сервисные функции:

public getCharacterNames(): Observable<string[]> { 
    return this._http.get(this._url + '/characters?access_token=' + this._key) 
    .map((res: Response) => res.json()) 
    .catch((error: any) => Observable.throw(error.json().error || 'server error')); 
} 

public getCharactersInventory(characterName: string): Observable<Bag[]> { 
    return this._http.get(this._url + '/characters/' + encodeURI(characterName) + '/inventory?access_token=' + this._key) 
    .map((res: Response) => res.json()) 
    .catch((error: any) => {return Observable.throw(error.json().error || 'server error'); }); 
} 

Эти действия:

public loadCharacters(): Action { 
    return { 
    type: Gw2Actions.LOAD_CHARACTERS 
    }; 
} 

public loadCharactersSuccess(characters: Character[]) { 
    return { 
    type: Gw2Actions.LOAD_CHARACTERS_SUCCESS, 
    payload: characters 
    }; 
} 

Это редуктор:

case Gw2Actions.LOAD_CHARACTERS_SUCCESS: { 
    return action.payload; 
    } 

И это эффект, который я попытался с помощью:

@Effect() private loadCharacters$: Observable<Action> = this._actions$ 
    .ofType(Gw2Actions.LOAD_CHARACTERS) 
    .map((action) => action.payload) 
    .switchMap(() => this._gw2Service.getCharacterNames()) 
    .map((characterNames) => { 
     let characters = []; 
     characterNames.forEach((characterName) => { 
     let characterBags = this._gw2Service.getCharactersInventory(characterName) 
      .subscribe((res) => res); 
     characters.push({ 
      name: characterName, 
      bags: characterBags 
     }); 
     }); 
     return characters; 
    } 
) 
    .map((characters: Character[]) => this._gw2Actions.loadCharactersSuccess(characters)); 
+0

'.map ((characterNames)' часть кажется мне неправильным, но не в состоянии выяснить, что нужно сделать там: | –

ответ

0

Я предлагаю отделить две проблемы Rxjs и ngstore. Ниже приведен подход к разрешению запасов из имен персонажей. Надеюсь, вы сможете сопоставить его с вашим эффектом ngstore.

let charNames$ = Rx.Observable.of([{name: 'a'}, {name: 'b'}, {name: 'c'}]); //mock names 
 
let getInventoryFromName = name => Rx.Observable.of({owner: name}).delay(1000); //mock inventory 
 

 
let result$ = charNames$.switchMap(names => Rx.Observable.forkJoin(names.map(n => getInventoryFromName(n.name)))); 
 

 
result$.subscribe(res => console.log('got some inventory/user pairs: ', res));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

я пытался реализации что-то вроде этого, и я не мог» t заставить его работать. Наверное, я упускаю или недопонимаю что-то – vilkatis

Смежные вопросы