通过使用Http,我们调用一个执行网络调用并返回http observable的方法:
getCustomer() {
return this.http.get('/someUrl').map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)
如果我们采用这个可观察的并添加多个订阅者:
let network$ = getCustomer();
let subscriber1 = network$.subscribe(...);
let subscriber2 = network$.subscribe(...);
Run Code Online (Sandbox Code Playgroud)
我们想要做的是确保这不会导致多个网络请求.
这可能看起来像是一个不寻常的场景,但实际上很常见:例如,如果调用者订阅了observable以显示错误消息,并使用异步管道将其传递给模板,那么我们已经有两个订阅者.
在RxJs 5中这样做的正确方法是什么?
也就是说,这似乎工作正常:
getCustomer() {
return this.http.get('/someUrl').map(res => res.json()).share();
}
Run Code Online (Sandbox Code Playgroud)
但这是在RxJs 5中这样做的惯用方式,还是我们应该做其他事情呢?
注意:根据Angular 5 new HttpClient,.map(res => res.json())所有示例中的部分现在都没用,因为现在默认采用JSON结果.
根据这个artcle,onComplete和onError功能subscribe是互斥的.
任何意义onError或onComplete事件将在我的事件中激起subscribe.
我有一个逻辑块,无论是否收到错误都需要执行,或者我成功完成了大量的信息.
我finally在python中查找类似的内容,但我发现的只是finally需要附加到我创建的可观察对象上.
但是我想在我订阅时,在流结束后,无论是成功还是出错,都要做这个逻辑.
有任何想法吗?
我不知道如何从Observable中提取值以由Observable存在的函数返回.我只需要从中返回一个值,没有别的.
当前版本有效
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
console.log(data)
}
)
}
getValueFromObservable()
Run Code Online (Sandbox Code Playgroud)
我需要这个工作,函数返回值,然后:
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
我认为我有基本概念,但有一些晦涩难懂
所以一般来说这就是我使用observable的方式:
observable.subscribe(x => {
})
Run Code Online (Sandbox Code Playgroud)
如果我想过滤数据,我可以使用:
import { first, last, map, reduce, find, skipWhile } from 'rxjs/operators';
observable.pipe(
map(x => {return x}),
first()
).subscribe(x => {
})
Run Code Online (Sandbox Code Playgroud)
我也可以这样做:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/first';
observable.map(x => {return x}).first().subscribe(x => {
})
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
我回顾了以下SO问题: 什么是热和冷可观测量?
总结一下:
然而,我觉得热和冷仍然是混乱的根源.所以这是我的问题:
默认情况下所有rx可观察量是否都是冷的(主题除外)?
我经常读到事件是热观察的典型隐喻,但我也读到这Rx.fromEvent(input, 'click')是一个冷可观察的(?).
是否有什么/哪些Rx运算符将冷观测值转换为热观测值(除了publish和之外share)?
例如,它如何与Rx运算符一起使用withLatestFrom?让我们cold$成为一个冷酷的观察者.会sth$.withLatestFrom(cold$,...)是一个热门观察?
或者,如果我不sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)和订阅sth1和sth2,将我总是看到两个相同的值sth?
我认为Rx.fromEvent会产生冷的可观测量,但事实并非如此,正如其中一个答案所述.但是,我仍然对此行为感到困惑:codepen.io/anon/pen/NqQMJR?editors=101.不同的订阅从同一个observable获得不同的值.click事件不是共享的吗?
我对angular和rxjs很新.我正在尝试创建一个angular2应用程序,从静态服务的文本文件(本地服务器)获取一些数据,我想检索并使用Angular2的http提供程序和rxjs的映射在固定时间映射到Datamodel interval(5000).反映对服务的txt文件的任何更改.
使用rxjs 4.x我知道你可以Observable.interval(5000)用来完成这项工作,但它似乎不存在于rxjs 5中.我的解决方法当前刷新整个应用程序使用<meta http-equiv="refresh" content="5" >哪个重新加载整个页面,从而重新加载数据.
所以我真正想要的是使用observable进行此操作的一些方法,也许是为了检查是否发生了任何更改.或者只是重新加载数据.
任何帮助或其他/更好的方式将非常感谢.
到目前为止我所拥有的:
@Injectable()
export class DataService {
constructor(private http:Http){}
getData(url) {
return this.http.get(url)
.map(res => {
return res.text();
})
.map(res => {
return res.split("\n");
})
.map(res => {
var dataModels: DataModel[] = [];
res.forEach(str => {
var s = str.split(",");
if(s[0] !== "") {
dataModels.push(new DataModel(s[0], parseInt(s[1]), parseInt(s[2])));
}
});
return dataModels;
})
}
}
@Component({
selector: 'my-app',
template: `Some html to display the data`,
providers: …Run Code Online (Sandbox Code Playgroud) 我正在学习RxJS和Angular 2.假设我有一个带有多个异步函数调用的promise链,它取决于前一个的结果,如下所示:
var promiseChain = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 2);
}, 1000);
});
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 3);
}, 1000);
});
});
promiseChain.then((finalResult) => {
console.log(finalResult);
});
Run Code Online (Sandbox Code Playgroud)
我在不使用promise的情况下单独使用RxJS的尝试产生了以下结果:
var observableChain = Observable.create((observer) => {
setTimeout(() => {
observer.next(1);
observer.complete();
}, 1000);
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) …Run Code Online (Sandbox Code Playgroud) 只是想知道Observable.combineLatest和 之间的区别是什么Observable.forkJoin?据我所知,唯一的区别是forkJoin期望Observables完成,同时combineLatest返回最新的值.
我想知道,如果在订阅之后使用.take(1)和使用.unsubscribewhen 之间的性能有任何差异unsubscribe:
var observable = Rx.Observable.interval(100);
Run Code Online (Sandbox Code Playgroud)
第一:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();
Run Code Online (Sandbox Code Playgroud)
第二:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
它的任何想法都会对性能产生任何不同的看法?