【问题标题】:Should we subscribe to a void function and how?我们应该订阅一个 void 函数吗?如何订阅?
【发布时间】:2016-07-15 16:33:44
【问题描述】:

Promises 很容易,因为我可以告诉函数 void 函数的返回类型是 Promise(我希望我是对的)。

我想对 Observables 做同样的事情,所以它会是这样的:

import {Observable, Subject} from "rxjs/Rx"

...
private personArray:Person[] = PERSONS; ///some persons in other file.
...

///This fucntion remove one person from my service.

public remove(id:number):Observable<void> {
    this.personArray = this.personArray.filter(person1=>person1.id !== id);
    return Observable.from(); ???
  }
  1. 订阅者不知道第一行是否引发错误。我确信有更好的方法可以做到这一点,我很高兴看到任何其他对此的不满。
  2. 我怎样才能使这段代码工作?

谢谢。

【问题讨论】:

    标签: javascript angular rxjs rxjs5


    【解决方案1】:

    如果您只想要 OnCompleted 消息,请使用 Observable.empty()。如果发生错误,可以使用Observable.throw(...)

    public remove(id:number):Observable<void> {
      try {
        this.personArray = this.personArray.filter(person1=>person1.id !== id);
        return Observable.empty();
      } catch (e) {
        return Observable.throw(e);
      }
    }
    

    或者,您可以使用.defer()。如果您的函数抛出异常,则会(自动)抛出 OnError:

    public remove(id:number):Observable<void> {
      return Observable.defer(() => {
        this.personArray = this.personArray.filter(person1=>person1.id !== id);
        return Observable.empty();
      });
    }
    

    【讨论】:

    • 好的,感谢您的快速回答。这是实施删除的最佳方式吗?正如我所提到的,订阅者不知道删除函数中的第一行是否返回错误。我使用的观察者是通用的,所以我应该导入什么来使用这个?
    • 我明白你的意思。添加了一种让订阅者收到错误的方法。看看吧。
    • 不用感谢。我添加了一个.defer(function) 示例。这更接近你想要的吗?
    • 是的!但是有一个小问题 - 可观察的泛型类型不能为 void:错误:TS2355:声明类型既不是“void”也不是“any”的函数必须返回一个值。
    • 您具体在哪一行得到该错误。另外,嗯,再想一想,也许.defer() 不是最优的,因为它只会在有人订阅时执行(也就是说,如果你调用remove() 并且不订阅它,它就不会执行。 ..).
    【解决方案2】:

    由于您不能真正使用void,并且类型并不重要,因为没有人会尝试解释任何值,所以只需使用any

    public remove(id:number):Observable<any> {
        this.personArray = this.personArray.filter(person1=>person1.id !== id);
        return Observable.empty<any>();
    }
    

    【讨论】:

    • Rxjs 没有提供更智能的解决方案?其他开发人员可能会认为我正在返回一些东西,这是错误的。你将如何实施它?也许它的承诺更好?
    • 这不是 RxJs 的问题。这是 TypeScript 语言的一个问题——它没有提供使用 void 作为泛型类型参数的方法。你会在 promises 中遇到同样的问题
    • 感谢您的回复。 Typescript 确实允许我们返回新的 Promise(()=>....)。所以最好的做法是在我们不返回某些东西时使用承诺。我希望听到您对此的看法。
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2012-06-14
    • 2018-01-01
    • 2021-07-22
    • 2012-05-30
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多