Take不是一个函数:Angular 7 | Observable.take抛出运行时错误

5

我正在构建一个购物车,使用了一个购物车服务,通过将商品数量分配给产品/向购物车添加产品。除了使用 take 以获取可观察项的第一实例之外,是否还有其他方法?

我已经正确导入了 take 操作符,但它仍然给出运行时错误。如果我不使用 take,则分配的数量是某个随机整数而不是1。

在下面的代码中,当对可观察对象使用 take() 时,我遇到了以下错误:

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import { Product } from '../app/models/product';
import 'rxjs/add/operator/take';//tried this one too
import { take } from 'rxjs-compat/operator/take';

@Injectable({
  providedIn: 'root'
})
export class ShoppingCartService {

  constructor(private db: AngularFireDatabase) { }

  private create() {
    return this.db.list('/shopping-carts').push({
      dateCreated: new Date().getTime()
    });
  }


  private getCart(cartId: string) {
    return this.db.object('/shopping-carts/' + cartId);
  }
  private async getOrCreateCartId() {
    let cartId = localStorage.getItem('cartId');
    if (cartId) return cartId;

    let result = await this.create();
    localStorage.setItem('cartId', result.key);
    return result.key;

  }

  async addToCart(product: Product) { 
    let cartId = await this.getOrCreateCartId();
    let item$ = this.db.object('/shopping-carts/'+cartId+'/items/'+product.$key);
    item$.take(1).subscribe(item=>{
      if(item.$exists()) item$.update({quantity : item.quantity + 1});
      else item$.set({product : product , quantity : 1 });
    });
  }

}




Error: Uncaught (in promise): TypeError: item$.take is not a function. (In 'item$.take(1)', 'item$.take' is undefined) http://localhost:4200/main.js:1581:35 step@http://localhost:4200/main.js:1534:27 fulfilled@http://localhost:4200/main.js:1506:62 onInvoke@http://localhost:4200/vendor.js:46707:39 run@http://localhost:4200/polyfills.js:2483:49 http://localhost:4200/polyfills.js:3217:37 onInvokeTask@http://localhost:4200/vendor.js:46698:43 runTask@http://localhost:4200/polyfills.js:2533:57 drainMicroTaskQueue@http://localhost:4200/polyfills.js:2940:42 invokeTask@http://localhost:4200/polyfills.js:2845:40 invokeTask@http://localhost:4200/polyfills.js:3885:20 globalZoneAwareCallback@http://localhost:4200/polyfills.js:3911:27
resolvePromise — zone.js:814
(anonymous function) — zone.js:724
fulfilled — products.component.ts:11
onInvoke — core.js:14143
run — zone.js:138
(anonymous function) — zone.js:872
onInvokeTask — core.js:14134
runTask — zone.js:188
drainMicroTaskQueue — zone.js:595
invokeTask — zone.js:500
invokeTask — zone.js:1540
globalZoneAwareCallback — zone.js:1566
1个回答

8

我注意到两个问题:

  1. 导入应该是:import { take } from 'rxjs/operators';

  2. 你应该使用pipe:在你的情况下:

    item$.pipe(take(1)).subscribe(...)

这里了解更多信息。


我也使用了一个管道,但是它会导致编译错误。 - Prateek Chitransh
你应该使用 take 删除所有其他的导入,只使用这一个,并确保如果你正在导入 Observable,它应该是 import { Observable } from 'rxjs'; - dream88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接