getCustomer() {
return this.http.get('/someUrl').map(res => res.json());
}
let network$ = getCustomer();
let subscriber1 = network$.subscribe(...);
let subscriber2 = network$.subscribe(...);
getCustomer() {
return this.http.get('/someUrl').map(res => res.json()).share();
}
但是这是RXJS5中的惯用方法吗,还是我们应该做其他的事情呢?
注意:根据Angular 5 newHttpClient
,所有示例中的.map(res=>res.JSON())
部分现在都是无用的,因为现在默认情况下假定了JSON结果。
编辑:从2021年开始,正确的方法是使用RXJS本地提出的Sharereplay
操作符。请参阅以下答案中的更多细节。
缓存数据,如果可用,则返回该数据,否则发出HTTP请求。
import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of'; //proper way to import the 'of' operator
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map';
import {Data} from './data';
@Injectable()
export class DataService {
private url: string = 'https://cors-test.appspot.com/test';
private data: Data;
private observable: Observable<any>;
constructor(private http: Http) {}
getData() {
if(this.data) {
// if `data` is available just return it as `Observable`
return Observable.of(this.data);
} else if(this.observable) {
// if `this.observable` is set then the request is in progress
// return the `Observable` for the ongoing request
return this.observable;
} else {
// example header (not necessary)
let headers = new Headers();
headers.append('Content-Type', 'application/json');
// create the request, store the `Observable` for subsequent subscribers
this.observable = this.http.get(this.url, {
headers: headers
})
.map(response => {
// when the cached data is available we don't need the `Observable` reference anymore
this.observable = null;
if(response.status == 400) {
return "FAILURE";
} else if(response.status == 200) {
this.data = new Data(response.json());
return this.data;
}
// make it shared so more than one subscriber can get the result
})
.share();
return this.observable;
}
}
}
柱塞示例
注意:当通过WebClient exchange()方法获得对ClientResponse的访问权限时,必须始终使用body或toEntity方法之一,以确保释放资源并避免HTTP连接池的潜在问题。如果不需要响应内容,可以使用bodyToMono(void.class)。但是,请记住,如果响应确实有内容,连接将被关闭,并且不会被放回池中。 我可以调用WebClient并忽略结果吗?或者是否有一个通
问题内容: 我最近从Angular转到了ReactJs。我正在使用jQuery进行API调用。我有一个API,该API返回要打印在列表中的随机用户列表。 我不确定如何编写我的API调用。最佳做法是什么? 我尝试了以下操作,但未得到任何输出。如果需要,我愿意实现替代API库。 下面是我的代码: 问题答案: 在这种情况下,您可以在中进行ajax调用,然后进行更新
问题内容: 当每个呼叫都取决于之前的呼叫是否已完成时,我试图找到创建异步呼叫的最佳方法。目前,我通过递归调用定义的流程函数来链接方法,如下所示。 这就是我目前正在做的。 然后我将其称为如下 虽然这对我来说非常好,但我不禁认为必须有一种更好(更简单)的方法。以后我的递归调用变得太深时,会发生什么? 注意 :我不是在浏览器中使用javascript,而是在Titanium框架中使用本机,这类似于Nod
关于SpringWebFlux的小问题,以及如何“链接”http调用。 通过一个具体的例子,这里是一个非常简单的SpringMVC示例,带有一个rest模板。 在这个片段中,我们看到了非常简单的内容。仅初始化一个rest模板。 超文本传输协议请求有效载荷对象的构造。 使用所构建的对象来查询第一外部web应用API以获得响应。 重要的是,需要第一个HTTP调用的响应来进行第二个HTTP调用。它们只能
问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意