如何在Angular 2中调用HTTP方法而不使用Observable

3
当我调用这个函数时,console.log()能够正常工作,但是http.delete方法从未运行,我认为这是因为我没有订阅observable。由于我是从表单上的按钮调用这个函数的,所以我不关心返回任何东西,有什么办法可以直接进行调用吗?
  deleteCompany(id) { 
      console.log('from data service: ', id);
      this.http.delete(this.url + 'Companies/' + id + '?' + this.token).map(res => res.json());
   }

编辑: 我改用这个了。这样处理是否正确?

import 'rxjs/add/operator/toPromise';
...
return this.http.delete(this.url + 'Companies/' + id + '?' + this.token).toPromise();

“编辑:”看起来很好。您也可以调用subscribe()而不传递回调函数。我认为这使意图更明显。 - Günter Zöchbauer
2个回答

7

正如@Gunter指出的那样,如果要使用可观察对象,则需要调用subscribe。如果您希望返回某些内容(因为Promise不是惰性的),则可以将observable转换为promise,如下所示:

import 'rxjs/add/operator/toPromise';
     deleteCompany(id) { 
          console.log('from data service: ', id);
         return this.http.delete(this.url + 'Companies/' + id + '?' + this.token).toPromise();
       }

为了消费它,请在您的组件中使用 then 而不是 subscribe ,例如:
this._yourServiceName.deleteCompany(this._id).then((data)=> console.log(data), (err) => console.log("error occured", err););

谢谢你的回答。为了确保我理解(我很新手),在你的例子中,你正在映射响应,以便我有东西可以在我的组件中使用,然后使用.promise来实际触发http调用,对吗?那么 'return' 在这里如何适用,因为我注意到你没有使用它? - Lee
你是对的。我忘记返回observable了(现在已经编辑过了)。通常,我们使用map(或任何其他方法)来转换数据流。使用map(res => res.json()将解析响应为JSON,但我们这里不需要使用它。toPromise方法将返回一个promise,该promise将使用组件中的then方法解决。 - candidJ

2

Observables是懒加载的,只有在调用subscribetoPromise之前才会执行。


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