当前位置: 首页 > 知识库问答 >
问题:

类型“Observable”上不存在属性“do”

查锦程
2023-03-14

升级到Angular 6.0和Rxjs到6.0后,我收到以下编译错误:

类型“Observable”上不存在属性“do”

代码如下:

import { Observable, of } from 'rxjs';
import 'rxjs/add/operator/do';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import { IProduct } from './product';

@Injectable()
export class ProductService { 
    constructor(
        private product: IProduct)
    {         
    }

    getProduct = () => { 
        return product.products
            // error on next line
            .do(data => console.log('All:' + JSON.stringify(data)))
            .catch(this.handleError);
    }

    private handleError(err: HttpErrorResponse) { 
        console.log(err.message);
        return Observable.throw(err.message);        
    }
}

有什么想法吗?


共有3个答案

曹和正
2023-03-14
匿名用户

Rxjs 6引入了一些突破性的更改,“do”操作符被“tap”操作符替换(来自“Rxjs/internal/operators”)。

您可以使用新的运算符重构代码,也可以通过添加rxjs compat库来实现向后兼容性(npm安装--save rxjs compat),从而仍然使用旧的“do”语法。

请注意,在RxJs 6之前,您必须导入do操作符:

import 'rxjs/add/operator/do';

更多详细信息:Angular HTTP GET与TypeScript错误http.get(...). map不是一个函数在[null]

赵健柏
2023-03-14
匿名用户

我很欣赏Tjaart van der Walt关于如何解决Angular/rxjs7中引入的“突破性变化”的回应。但是我仍然遇到了几个问题,试图将他的响应应用于我的Angular拦截器:

这是更新后的代码(未能编译的部分标记为“OLD”)

import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpResponse} from '@angular/common/http';
import {HttpHandler, HttpRequest, HttpErrorResponse} from '@angular/common/http';

/*
  OLD:
  import {Observable} from 'rxjs/Observable';
  import 'rxjs/add/operator/do';
 */
import { Observable } from 'rxjs';
import { of } from 'rxjs';
import { tap, catchError } from 'rxjs/operators';

import { AuthService } from './auth.service';

@Injectable()
export class StockAppInterceptor implements HttpInterceptor {

  constructor(private authService: AuthService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (this.authService.authToken) {
      const authReq = req.clone({
        headers: req.headers.set(
          'Authorization',
          this.authService.authToken
        )
      });
      console.log('Making an authorized request');
      req = authReq;
    }
    /*
     * OLD:
     * return next.handle(req)
     *   .do(event => this.handleResponse(req, event),
     *      error => this.handleError(req, error));
     */
    return next.handle(req).pipe(
      tap(
        event => this.handleResponse(req, event),
        error => this.handleError(req, error)
      )
    );
  }


  handleResponse(req: HttpRequest<any>, event) {
    console.log('Handling response for ', req.url, event);
    if (event instanceof HttpResponse) {
      console.log('Request for ', req.url,
          ' Response Status ', event.status,
          ' With body ', event.body);
    }
  }

  handleError(req: HttpRequest<any>, event) {
    console.error('Request for ', req.url,
          ' Response Status ', event.status,
          ' With error ', event.error);
  }
}

所需的更改包括更改导入路径,以及替换管道()、tap()和()的

此链接也是RxJS6更改的良好资源:

https://www.academind.com/learn/javascript/rxjs-6-what-changed/

丌官远
2023-03-14

问题不在于角度,而在于rxjs。rxjs引入了rxjs版本6的突破性更改。

要在不更改任何代码的情况下重新运行代码,请安装以下软件包:

npm安装rxjs-compat@6--保存

然后,您应该能够编译您的项目。rxjs-compat是一个临时解决方案,因此您需要更新代码库以使用新版本。

您需要更新的内容:

>

  • 从更新导入语句

    从“rxjs/Observable”导入{Observable}

    从"rxjs"导入{可观察};

    从更新您的操作员导入

    导入'rxjs/add/operator/do'

    从rxjs/运算符导入{do};

    由于与JavaScript保留字的名称冲突,一些运算符也被重命名。他们是

    >

  • do=

    捕获=

    开关=

    最后=

    然后,您也无法再链接您的操作符。您需要使用管道操作符,例如。

    // an operator chain
    source
      .map(x => x + x)
      .mergeMap(n => of(n + 1, n + 2)
        .filter(x => x % 1 == 0)
        .scan((acc, x) => acc + x, 0)
      )
      .catch(err => of('error found'))
      .subscribe(printResult);
    
    // must be updated to a pipe flow
    source.pipe(
      map(x => x + x),
      mergeMap(n => of(n + 1, n + 2).pipe(
        filter(x => x % 1 == 0),
        scan((acc, x) => acc + x, 0),
      )),
      catchError(err => of('error found')),
    ).subscribe(printResult);
    

  •  类似资料:
    • 我使用“angular2网页包”和“angular2/表格,可见”,但遇到错误,需要帮助。。 有一个自定义表单验证程序-- 我可以找到文件"/projection_direction/node_modules/rxjs/操作员/DebounceTime.js" 为什么会有这样的错误- 类型“Observable”上不存在属性“debouceTime”。

    • 嗨,我正在使用Angular 2 final和router 3.0。我想过滤从 我想做的是: 可以是instanceOf,或,但我只想要。但是我得到一个错误

    • 我得到这个错误: 属性'toPromise'不存在于类型'观察'. any中

    • 在Angular 2使用Http服务的文档页面上,有一个示例。 我克隆了angular2 webpack初学者项目,并自己添加了上述代码。 我导入使用 我假设属性也被导入(起作用)。查看了rxjs.beta-6的更改日志,没有提到任何关于的内容。

    • 我在尝试创建将keyup事件转换为可观察流时遇到问题。 我正在学习Ng书籍第6版。我被困在一个示例中,在您键入时搜索YouTube视频。当搜索返回时,我们将显示视频缩略图结果列表,以及每个视频的描述和链接。 因此,我们使用observable.from事件:https://github.com/NiLinli/ng-book2-angular-6-r68-code-samples/blob/mas

    • 在使用rxjs的角度2中,我试图将promise转换为可观察的。正如许多在线指南所显示的,我在上使用了。其中抛出错误: Observable的导入方式如下: 尝试导入像其他运算符一样会导致错误: 即使我抑制了typescript错误,它仍然会导致错误: 错误: rxjs回购协议中也报告了类似的问题,但也没有解决方案。