Как заставить эту функцию ждать HTTP-запрос - PullRequest
0 голосов
/ 01 марта 2019

У меня есть эта функция в Angular 2, которую я не написал, но которая в настоящее время работает должным образом:

myFunction(): Observable<Song> {
    return this.user.getSong$()
        .mergeMap((track: Track) => {
            if (track.isSingle()) {
                return this.getSingle(track.getId());
            } else {
                throw 'error';
            }
        });
}

Но мне очень трудно понять некоторые вещи об этом. Первый вопрос: Я прочитал абсолютную тонну , но я не могу понять разницу между mergeMap и map.Я не понимаю, что делает mergeMap.Почему mergeMap здесь?

Теперь о реальной проблеме, которую я пытаюсь решить.Мне нужно сделать HTTP-вызов и завершить его до того, как он что-нибудь вернетЯ сделал для него другую функцию, которая возвращает Observable:

populate(sourceType: string, sourceId: number): Observable<object> {
    return this.http.get(`//populate/${sourceType}/${sourceId}`)
        .map((response: Response) => {
            return <string[]> response.json();
        });
}

Когда я пытаюсь объединить это с моей другой функцией, я получаю:

myFunction(): Observable<Song> {
    return this.user.getSong$()
        .mergeMap((track: Track) => {
            if (track.isSingle()) {
                this.populate('list', track.getId()).subscribe(
                    () => {},     // I don't care what the request returns,
                    () => {},     // or if it returns an error.
                    (result) => { // I only care when it's done.
                        return this.getSingle(track.getId());
                    }
                );
            } else {
                throw 'error';
            }
        });
}

Это не 'не работает вообще, но я не могу отладить вывод сообщения об ошибке и не знаю, как заставить его работать.Помогите?

TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
    at Object.subscribeToResult (Rx.js?1551417548052:8237)
    at MergeMapSubscriber._innerSub (Rx.js?1551417548052:3336)
    at MergeMapSubscriber._tryNext (Rx.js?1551417548052:3333)
    at MergeMapSubscriber._next (Rx.js?1551417548052:3318)
    at MergeMapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
    at MapSubscriber._next (Rx.js?1551417548052:4975)
    at MapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
    at MapSubscriber._next (Rx.js?1551417548052:4975)
    at MapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
    at MapSubscriber._next (Rx.js?1551417548052:4975)

1 Ответ

0 голосов
/ 01 марта 2019

Просто попробуйте следующее.Что касается mergeMap, я думаю, вам нужно потратить некоторое время на изучение Rxjs, есть много ресурсов в Интернете.Короче говоря, mergeMap похоже на обещание. Затем, но в отличие от обещания. Тогда, когда вы можете вернуть значение или другое обещание, с mergeMap вам потребуется вернуть Observable в обратном вызове.

myFunction(): Observable<Song> {
    return this.user.getSong$()
        .mergeMap((track: Track) => {
            if (track.isSingle()) {
                return this.populate('list', track.getId()).pipe(
                        mergeMap(_=>this.getSingle(track.getId())
            );

            } else {
                throw 'error';
            }
        });
      }
...