在Angular 1.x中,我有时需要提出多个http请求,并对所有响应做一些事情.我会把所有的promises抛出一个数组并调用Promise.all(promises).then(function (results) {...}).
Angular 2最佳实践似乎指向使用RxJS Observable作为http请求中的承诺的替代.如果我有两个或更多从http请求创建的不同Observable,它们是否相当于Promise.all()?
我回顾了以下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事件不是共享的吗?
我正在学习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) 对我来说,对于RxJs 5 share()运算符的工作原理并不是100%清楚,请参阅最新的文档.Jsbin 这里的问题.
如果我创建一个0到2系列的observable,每个值相隔一秒:
var source = Rx.Observable.interval(1000)
.take(5)
.do(function (x) {
console.log('some side effect');
});
Run Code Online (Sandbox Code Playgroud)
如果我为这个observable创建了两个订阅者:
source.subscribe((n) => console.log("subscriptor 1 = " + n));
source.subscribe((n) => console.log("subscriptor 2 = " + n));
Run Code Online (Sandbox Code Playgroud)
我在控制台中得到这个:
"some side effect ..."
"subscriptor 1 = 0"
"some side effect ..."
"subscriptor 2 = 0"
"some side effect ..."
"subscriptor 1 = 1"
"some side effect ..."
"subscriptor 2 = 1"
"some side effect ..."
"subscriptor 1 = 2"
"some …Run Code Online (Sandbox Code Playgroud) 我发现rxJS文档将它们定义为
什么是主题?RxJS主题是一种特殊类型的Observable,允许将值多播到许多观察者.虽然普通的Observable是单播的(每个订阅的Observer都拥有Observable的独立执行),但Subject是多播的.
它继续举例,但我正在寻找一个基本的ELI5解释.根据我的理解,它有助于处理和定义序列中的项目.那是对的吗?
我认为,对于我和其他人来说,看看一个简单的函数,有没有定义rxJS主题,以了解它为什么重要,这将是最有帮助的?
谢谢!
这是一个类似于如何使用lodash从对象中删除未定义和空值的问题?.但是,那里提出的解决方案并不保留构造函数.除此之外,我想只删除那些以'_'开头的键.
这是我正在寻找的,似乎无法从lodash获得:
输入: new Cons({key1 : 'value1', key2 : {key21 : 'value21', _key22: undefined}, key3: undefined, _key4 : undefined})
输出:
{key1 : 'value1', key2 : {key21 : 'value21'}, key3: undefined}
例如 function Cons(obj){_.extend(this, obj)}
我有一个omitBy使用lodash 的解决方案,但是,我松开了构造函数信息(即我不能再使用它instanceof Cons来区分对象构造函数).forIn看起来像是递归遍历的一个很好的候选者,但它只为我提供了value和key.我还需要路径才能删除对象(带unset).
请注意:
instanceof whatevertheconstructorwas仍为true有没有更好的解决方案(使用lodash或其他方式)?
我正在通过这本官方食谱学习Angular2 .
以下代码突然出现.为什么"missionAnnounced $"没有变量声明?让missionAnnounced $ = ...下面代码的逻辑是什么?
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class MissionService {
// Observable string sources
private missionAnnouncedSource = new Subject<string>();
private missionConfirmedSource = new Subject<string>();
// Observable string streams
missionAnnounced$ = this.missionAnnouncedSource.asObservable();
missionConfirmed$ = this.missionConfirmedSource.asObservable();
// Service message commands
announceMission(mission: string) {
this.missionAnnouncedSource.next(mission);
}
confirmMission(astronaut: string) {
this.missionConfirmedSource.next(astronaut);
}
}
Run Code Online (Sandbox Code Playgroud) 根据RxJS 5 MIGRATION.md,它看起来像shareReplay()被删除了.
.publishReplay(1).refCount()忠实地复制行为?基本上我需要将最新的单个数据集重播给任何新订阅者.我有一个TypeScript/Angular 2 Observable,在我第一次调用它时效果很好.但是,我有兴趣将多个订阅者附加到同一个observable,并以某种方式刷新可观察的和附加的订阅者.这是我得到的:
query(): Rx.Observable<any> {
return this.server.get('http://localhost/rawData.json').toRx().concatMap(
result =>
result.json().posts
)
.map((post: any) => {
var refinedPost = new RefinedPost();
refinedPost.Message = post.Message.toLowerCase();
return refinedPost;
}).toArray();
}
Run Code Online (Sandbox Code Playgroud)
假设有一个刷新按钮,当按下该按钮时,重新执行此observable,并且连接到它的任何订阅者都会获得一组更新的数据.
我怎么能做到这一点?
javascript ×10
rxjs ×9
rxjs5 ×5
angular ×4
typescript ×2
angularjs ×1
lodash ×1
observable ×1
promise ×1
subject ×1