我有一些代码片段如下
var videosNeedFix = Rx.Observable.fromArray(JSON.parse(fs.readFileSync("videoEntries.json"))).share();
videosNeedFix.count().subscribe(function(count){ //subscrption A
console.log(count + " in total");
});
videosNeedFix.subscribe(function(videoEntry){ //subscription B
console.log(videoEntry.id, videoEntry.name, videoEntry.customFields);
});
videoEntries.json是videoEntry对象的JSON序列化数组。我期待订阅A和订阅B都接收videosNeedFix可观察的数据。
但是,根据控制台日志,只有订阅A将接收数据而不接收订阅B.如果我交换了两个订阅的顺序,只有subscriptionB会看到数据。为什么observable只向第一个订阅发送数据?
答案 0 :(得分:0)
对于Rx.Subject来说,这是一个很好的用例(也许只是 - 见To Use Subject Or Not To Use Subject?)
考虑以下示例。这段代码(在评论中提到的.delay()hack)会起作用,但对我来说似乎有些笨拙:
let stream$ = Rx.Observable
.return(updatesObj)
.map(obj => Object.assign({}, obj.localData, obj.updates))
.delay(1) //Hacky way of making it work
.share()
stream$
.flatMap(obj => Observable.fromPromise(AsyncStorage.setItem('items', JSON.stringify(obj))))
.catch(Observable.return(false))
.subscribe()
stream$
.subscribe(obj => dispatch(dataIsReady(obj)))
Rx.Subjects的示例:
let subjS = new Rx.Subject()
let stream$ = subjS
.map(obj => Object.assign({}, obj.localData, obj.updates))
.share()
stream$
.flatMap(obj => Observable.fromPromise(AsyncStorage.setItem('items', JSON.stringify(obj))))
.catch(Observable.return(false))
.subscribe()
stream$
.subscribe(obj => dispatch(dataIsReady(obj)))
subjS.onNext(updatesObj)