【问题标题】:How to fix 'source.lift is not a function' error in angular?如何修复角度中的“source.lift 不是函数”错误?
【发布时间】:2018-08-22 11:20:23
【问题描述】:

在进行 http get 调用时,我正在使用 angular project source.lift is not a function 的自定义版本。错误在core.js 文件中。

如何解决这个问题?

【问题讨论】:

    标签: angular webpack rxjs


    【解决方案1】:

    我们也遇到了同样的问题。最后证明是括号不匹配的问题。我们使用了 switchMap 运算符和 catcherror 运算符。但是因为我们把括号弄错了。有趣的是,catcherror 运算符被用作 switchMap(结果选择器)的第二个参数,但仍然编译。所以请仔细检查你的括号。

    【讨论】:

    • 好一个 - 这正是我的问题。真的很难发现!
    • 在我的情况下,我有一个双映射 .map(map(mappingFunction)) 而不是 .map(mappingFunction) 触发了这个错误
    • 在我的情况下,我的错误是:subscribe(tap((): void => { ... })) 而不是(正确版本):subscribe((): void => { ... })tapsubscribe 部分内:-$
    【解决方案2】:

    遇到同样的问题。 catchError 不应出现在抽头括号中。

    错误:点击时调用了 catchError

      getHeroes() : Observable<Hero[]> {
        return this.http.get<Hero[]>(this.heroesUrl)
          .pipe(tap(_ => console.log('Fetching heroes'),
          catchError(this.handleError('getting heroes', []))  ))
      }
    

    正确的是:(catchError not in tap)

      getHeroes() : Observable<Hero[]> {
        return this.http.get<Hero[]>(this.heroesUrl)
          .pipe(tap(_ => console.log('Fetching heroes')),
          catchError(this.handleError('getting heroes', [])  ))
      }
    

    【讨论】:

    • 不错的收获!你刚刚为我节省了很多时间:)
    【解决方案3】:

    我在我的网络应用程序中遇到了同样的错误,直到我意识到要测试升级 rxjs 版本时才修复它,因为我在 6.0.0 有它,此时将其更改为最后一个版本 6.3 .2 解决了我的问题。 总之,这是 rxjs 第一版的一个错误,我们应该多测试一下,但到目前为止还不错。 希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      尝试检查您的 webAPI。

      如果您无权访问 Web 服务器的日志,您可以设置 null 而不是 'catchError' 块并使用调试器检查您的 Angular 应用程序。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,并通过使用 catch 以及不在内部的管道作为 catchError 的参数来解决

        this.http.post(payload)
            .pipe(map((res) => {
                    return res.data;
                }),
             )
             .catch(err => {
                 throw of(err);
                });
        }
        

        【讨论】:

          【解决方案6】:

          我曾多次遇到此错误,在进行单元测试时更是如此,但在工作代码或测试代码中可以重新创建问题。但我意识到只有当我将 catchError() 管道放置在其他转换管道(如 map() 之后)时。我将 catchError() 移到管道的顶部,它又可以正常工作了。

          不正确:

          obs.pipe(
            map((data: Data) => {
              // TODO: transform your data
            }),
            tap((registrationResponse) => {
              // TODO: transform your data
            }),
            catchError((error) => {
              // TODO: Throw an error
              throw new Error('Throw a different error');
              // OR        
              // TODO: Catch error and return a different observable value
              return of(false)
            })
          );
          

          正确:

          obs.pipe(
            catchError((error) => {
              // TODO: Throw an error
              throw new Error('Throw a different error');
              // OR        
              // TODO: Catch error and return a different observable value
              return of(false)
            }),
            map((data: Data) => {
              // TODO: transform your data
            }),
            tap((registrationResponse) => {
              // TODO: transform your data
            })
          );
          

          虽然上述方法有效 - 我认为这是设计使然,尽管我还没有遇到任何有关它的官方文档。我相信这种行为是因为您在“catchError”中捕获的错误来自 Observable,而不是您的实现/转换。因此,在 map() si 等任何转换管道之前需要 catchError() 是有意义的

          【讨论】:

            【解决方案7】:

            对我来说,我使用 catchError 没有 tap

            错误:

            import {catchError} from 'rxjs/operators';
            
            this.http.get(url, options).pipe(
                catchError(
                  (err: HttpErrorResponse) => {
                    // Do Stuff
                  }
                )
              );
            

            正确:

            import {catchError, tap} from 'rxjs/operators';
            
            this.http.get(url, options).pipe(
                tap(
                  () => {},
                  catchError(
                    (err: HttpErrorResponse) => {
                      // Do Stuff
                    }
                  )
                )
              );
            

            【讨论】:

              【解决方案8】:

              对于所有在 Angular 中使用窗口时遇到此问题的人 - 我错误地从 rxjs 导入了窗口,这引发了此错误。

              【讨论】:

                猜你喜欢
                • 2019-10-07
                • 2019-11-22
                • 2019-12-25
                • 2021-06-12
                • 2019-07-01
                • 1970-01-01
                • 1970-01-01
                • 2020-07-18
                • 1970-01-01
                相关资源
                最近更新 更多