繁体   English   中英

如何使此功能等待HTTP请求

[英]How to make this function wait for an HTTP request

我没有在Angular 2中使用此功能,但目前可以正常使用:

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

但是我很难理解它的某些方面。 第一个问题:我读了绝对 ,但我无法理解mergeMapmap之间的区别。 我不明白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)

只需尝试以下。 关于什么是mergeMap ,我认为您需要花一些时间来学习Rxjs,在线上有很多资源。 简而言之, mergeMap有点像mergeMap但是与mergeMap不同,在那里您可以返回值或另一个promise,使用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';
            }
        });
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM