代码之家  ›  专栏  ›  技术社区  ›  Oam Psy

switchMap类型void不能分配给类型observateInput<{}>

  •  2
  • Oam Psy  · 技术社区  · 7 年前

    Argument of type '(result: any) => void' is not assignable to parameter of type '(value: any, index: number)' => ObservableInput<{}>
    

    在我的切换地图上使用。

    --不带switchMap的简单示例----

    购物车组件

    ngOnInit() {
        this.systemPreferences.getPreferences()
            .subscribe(
                (result: any) => {
                    this.headerTitle = result.title || '';
                },
                (err) => {
                    console.log('there has been an error');
                },
                () => // Some completion code
            );
    }
    

    系统首选项.service.ts:

    const CACHE_SIZE = 1;
    
    export class SystemPreferences {
        private $cache: Observable<Object>
    
        private requestConfig() {
             return this.http.get("/api/some/endpoint").pipe(
                 map(response => response.value)
             );
        }
    
        public getPreferences() {
            if (!this.cache$) {
                this.cache$ = this.requestConfig().pipe(
                 shareReplay(CACHE_SIZE)
                );
            }
    
            return this.cache$;
        }
    }
    

    /api/some/endpoint示例响应:

    {
        "appName": "Tables Forks and Spoons",
        "title": "My title",
        "regionUrls": [
            "http://www.region1.com:8021",
            "http://www.region2.com:8021",
            "http://www.region3.com:8021",
            "http://www.region4.com:8021"
        ],
        "nonRegionUrls": [
            "http://www.non-region1.com:8021",
            "http://www.non-region2.com:8021",
            "http://www.non-region3.com:8021",
            "http://www.non-region4.com:8021"
        ]
    }
    

    --switchMap的类型错误简单示例----

    购物车组件

    ngOnInit() {
        this.systemPreferences.getPreferences()
            .pipe(
                .switchMap((result: any) => {
    
                   this.systemPreferences.getLiveUrl(result['regionUrls']);
    
                }))
            .subscribe(
                (result: any) => {
                    this.liveLink = result.liveLink; // result.livelink is added as part of this.systemPreferences.getLiveUrl above
                    this.headerTitle = result.title || '';
                },
                (err) => {
                    console.log('there has been an error');
                }
            );
    }
    

    const CACHE_SIZE = 1;
    
    export class SystemPreferences {
        private $cache: Observable<Object>
    
        private requestConfig() {
             return this.http.get("/api/some/endpoint").pipe(
                 map(response => response.value)
             );
        }
    
        public getPreferences() {
            if (!this.cache$) {
                this.cache$ = this.requestConfig().pipe(
                 shareReplay(CACHE_SIZE)
                );
            }
    
            return this.cache$;
        }
    
        public getLiveUrl(urls: any) {
            let promises = [];
    
            urls.forEach((url) => {
               promises.push(this.http.get(url + 'some/endpoint/')); 
            });
    
            const results = forkJoin(promises) {
                .subscribe((data: any) => {
                    return this.getBest(data);
                }
            }
        }
    
        public getBest(data: any) {
            // Loops through data, and returns a single URL as a string
            // 'http//www.thebesturltouse.com'
        }
    }
    

    尝试返回建议的第二个可观测值(见下文)具有与上文相同的类型void error。

    购物车组件

    ngOnInit() {
        this.systemPreferences.getPreferences()
            .pipe(
                .switchMap((result: any) => {
                   return this.systemPreferences.getLiveUrl(result['regionUrls']);
                }))
            .subscribe(
                (result: any) => {
                    this.liveLink = result.liveLink; // result.livelink is added as part of this.systemPreferences.getLiveUrl above
                    this.headerTitle = result.title || '';
                },
                (err) => {
                    console.log('there has been an error');
                }
            );
    }
    

    系统首选项.service.ts:

    const CACHE_SIZE = 1;
    
    export class SystemPreferences {
        private $cache: Observable<Object>
        private $switchObs: Observable<Object> 
    
        private requestConfig() {
             return this.http.get("/api/some/endpoint").pipe(
                 map(response => response.value)
             );
        }
    
        public getPreferences() {
            if (!this.cache$) {
                this.cache$ = this.requestConfig().pipe(
                 shareReplay(CACHE_SIZE)
                );
            }
    
            return this.cache$;
        }
    
        public getLiveUrl(urls: any) {
            let promises = [];
    
            urls.forEach((url) => {
               promises.push(this.http.get(url + 'some/endpoint/')); 
            });
    
            const results = forkJoin(promises) {
                .subscribe((data: any) => {
                    this.$switchObs = this.getBest(data);
                    return this.$switchObs;
                }
            }
        }
    
        public getBest(data: any) {
            // Loops through data, and returns a single URL as a string
            // 'http//www.thebesturltouse.com'
        }
    }
    

    更新到多个switchMaps

    ngOnInit() {
        this.systemPreferences.getPreferences()
            .pipe(
                .switchMap((result: any) => {
                   return this.systemPreferences.getLiveUrl(result['regionUrls']);
                }),
                .switchMap((liveRegion: any) => {
                   return this.systemPreferences.getBest(liveRegion);
                }))
            .subscribe(
                (bestUrl: String) => {
                    console.log('best');
                    console.log(bestUrl);
                },
                (err) => {
                    console.log('there has been an error');
                }
            );
    }
    

    系统首选项.service.ts:

    const CACHE_SIZE = 1;
    
    export class SystemPreferences {
        private $cache: Observable<Object>
        private $switchObs: Observable<String> 
    
        private requestConfig() {
             return this.http.get("/api/some/endpoint").pipe(
                 map(response => response.value)
             );
        }
    
        public getPreferences() {
            if (!this.cache$) {
                this.cache$ = this.requestConfig().pipe(
                 shareReplay(CACHE_SIZE)
                );
            }
    
            return this.cache$;
        }
    
        public getLiveUrl(urls: any) {
            let promises = [];
    
            urls.forEach((url) => {
               promises.push(this.http.get(url + 'some/endpoint/')); 
            });
    
            return forkJoin(promises);
        }
    
        public getBest(data: any) {
            // Loops through data, and returns a single URL as a string
            // 
            return this.$switchObs; // = 'http//www.thebesturltouse.com'
        }
    }
    

    'best'
    h
    'best'
    t
    'best'
    t
    'best'
    p
    'best'
    :
    'best'
    /
    'best'
    /
    'best'
    w
    'best'
    w
    'best'
    w
    'best'
    .
    'best'
    b
    etc etc etc
    


    更新。

    这不是解决这个问题的最好办法。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Jan-Niklas Wortmann    7 年前

    这个问题与 switchMap 操作员本身。事实上 getLiveUrl getLiveUrl getBest 实际上,这可能会影响解决方案。):

     public getLiveUrl(urls: any) {
            let promises = [];
    
            urls.forEach((url) => {
               promises.push(this.http.get(url + 'some/endpoint/')); 
            });
    
            return forkJoin(promises).pipe(
               map(data => this.getBest(data))
            );
        }