javascript - 如何在 Angular 5 的纯管道中使用 HTTP 调用

标签 javascript angular typescript

我正在创建一个将一种货币值转换为另一种货币值的管道。我正在进行 HTTP 调用以转换值。

@Pipe({
    name: "currencyConverter"
})
export class CurrencyConverterPipe implements PipeTransform {

    transform(value: number, currencyPair: string): number {
        let sourceCurrency = currencyPair.split(":")[0];
        let destinationCurrency = currencyPair.split(":")[1];
        this.currencyConverterService.convert(sourceCurrency, destinationCurrency).subscribe(successData => {
            return successData['fiatValue'] * value;
        }, errorData => {
            console.error(errorData);
        })
    }
}

在 HTML 中

<p> {{ value | currencyConverter:'BTC:USD'}}</p>

我在 UI 中看不到任何值。当我使我的管道 不纯 时,它可以工作,但它正在对服务器进行许多 HTTP 调用。有没有办法在管道中不使用 pure: false

进行 HTTP 调用

最佳答案

这个管道不是纯粹的设计。

为了不引起多个请求,它应该返回相同的可观察对象,在输入更改之前不会执行其他请求,例如:

@Pipe({
  name: "currencyConverter",
  pure: false
})
export class CurrencyConverterPipe  {
  private sourceCurrency;
  private destinationCurrency;
  private valueSubject = new Subject();
  private value$ = this.valueSubject.asObservable().distinctUntilChanged()
  .switchMap(value => {
     return this.currencyConverter
     .convert(sourceCurrency, destinationCurrency))
     .map((data) => data * value);
  });

  constructor(private currencyConverter: ...) {}

  transform(value: number, currencyPair: string): number {
    this.sourceCurrency = currencyPair.split(":")[0];
    this.destinationCurrency = currencyPair.split(":")[1];
    this.valueSubject.next(value);
    return this.value$;
  }
}

因为它应该只与 async 管道一起使用,所以将它们连接在一起并扩展 AsyncPipe 是有意义的:

@Pipe({
  name: "currencyConverterAsync",
  pure: false
})
export class CurrencyConverterPipe extends AsyncPipe {
  private sourceCurrency;
  private destinationCurrency;
  private valueSubject = new Subject();
  private value$ = this.valueSubject.asObservable().distinctUntilChanged()
  .switchMap(value => {
     return this.currencyConverter
     .convert(sourceCurrency, destinationCurrency))
     .map((data) => data * value);
  });

  constructor(cdRef: ChangeDetectorRef, private currencyConverter: ...) {
    super(cdRef);
  }

  transform(value: number, currencyPair: string): number {
    this.sourceCurrency = currencyPair.split(":")[0];
    this.destinationCurrency = currencyPair.split(":")[1];
    this.valueSubject.next(value);

    return super.transform(this.value$);
  }
}

关于javascript - 如何在 Angular 5 的纯管道中使用 HTTP 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48899293/

相关文章:

javascript - React Native Flatlist 不重新渲染 Redux

javascript - 如何在异步函数调用结束之前禁用按钮?

javascript - 如何使用组件将动态 HTML 加载到 DIV 中? Angular 5

javascript - Angular 4 - 使用元素的 Id 在 DOM 中显示/隐藏元素

javascript - 根据另一个下拉列表更新下拉值 - jQuery

java - 在 Android Webview 中以编程方式填写表单 - JavaScript

javascript - 难以对齐文本元素

javascript - 当我添加 [(ngModel)] 时,Angular.JS 丢失 HTML 格式

Angular2 - 如何链接异步 http 请求并在失败时停止

typescript - 具有枚举类型问题的 Ngrx 操作