【问题标题】:Angular http.post without .subscribe callback没有 .subscribe 回调的 Angular http.post
【发布时间】:2016-12-23 06:09:32
【问题描述】:

我想知道我是否可以只发出一个 http 发布请求而不订阅回调,像这样

 this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null);

而不是这个

 this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null)
        .subscribe();

【问题讨论】:

    标签: angular typescript angular2-services


    【解决方案1】:

    我不认为你可以。

    http.post(以及 get、put、delete 等)返回一个冷的 Observable,即一个 Observable,它:

    它的底层生产者在订阅期间创建并激活

    Source.

    这意味着Observable所代表的功能只能通过subscribe()方法激活。

    还有订阅的便捷方法,请参阅Observable#toPromise() here 的实现细节。

    【讨论】:

    • 该问题应该被删除或扩展,因为现在它具有误导性。 2oppin 已经在下面表明你实际上可以做到,所以声明 I do not think you can. 是错误的。
    • @Sasuke Uchiha 我认为toPromise实际上订阅了its implementation中的Observable
    • 这是一个很好的收获。请您将其添加到您的答案中吗?
    【解决方案2】:

    我正在使用转换为 Promise(需要 rxjs):

    import 'rxjs/add/operator/toPromise';
    @Injectable()
    export class SomeService {
    ....
      post(sp: Seatplace, date?: Date) : Promise<any> {
         return this.http.post(
           '/list/items/update?itemId=' + itemId + "&done=" + done, 
            null
         ).toPromise();
      }
    }
    

    【讨论】:

      【解决方案3】:

      我也有同样的问题,但后来我发现我实际上不在乎是否有人订阅了 observable。我只想在任何情况下发送 POST 请求。这是我想出的:

      postItem(itemData) {
          var observable = this.http.post('/api/items', itemData)
              .map(response => response.json()) // in case you care about returned json       
              .publishReplay(); // would be .publish().replay() in RxJS < v5 I guess
          observable.connect();
          return observable;
      }
      

      调用connect() 后立即发送请求。但是,如果需要,postItem 的调用者仍然可以订阅一个 observable。由于使用publishReplay() 而不仅仅是publish(),因此即使在 POST 请求完成后也可以订阅。

      【讨论】:

      • 这会抛出error TS2339: Property 'json' does not exist on type 'Object'.
      • 如果其他人想在 RxJS 6 中使用这种方法,您必须使用 Observable 来连接它:const observable = this.http.post&lt;T&gt;('/api/items', itemData).pipe(publishReplay()); (observable as ConnectedObservable&lt;T&gt;).connect(); return observable;
      • @kremerd ConnectableObservable 未连接...谢谢!
      【解决方案4】:

      就像@picci 的观点一样,常规的 observables 是冷的 observables。如果你想提出请求,你可以尝试@lex82 idea,这里是 rxjs 6 草稿:

      import { ConnectableObservable } from "rxjs"
      import { publish } from "rxjs/operators";
      
      const myConnectableObservable: ConnectableObservable<any> = this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null).pipe(publish()) as ConnectableObservable<any>;
      myConnectableObservable.connect();
      

      这基本上就像订阅,但没有真正的订阅。

      https://blog.danlew.net/2018/09/25/connectable-observables-so-hot-right-now/

      【讨论】:

        【解决方案5】:

        您可以简单地使用如下 toPromise 方法:

        public getEmployerListFromService() {
            const url = `/list/items/update?itemId=`;
            return this.http.get<any>(url).toPromise().then(response => {
              console.log(response);
            })
          }
        

        并通过以下方式调用此方法:

         this.service.getEmployerListFromService();
        

        【讨论】:

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