这是一个基本的rxjs问题,我找不到答案。假设我创建了一个可观察的字符串,然后在一段时间后我想为它分配一个新值。似乎没有观察到新值,因为它没有被记录。我知道rx正在工作,因为初始值被记录为一连串的字符。你能否解释一下我做错了什么,以及为了能够记录这个新值我需要修改什么?这里我使用setTimeout函数来更新变量,但实际上它将是一个ajax请求,它返回一个保存该值的JSON对象。
var observableId = "hwebd788ew98ew9";
var sourceAid = Rx.Observable.from(observableId);
var subscriptionAid = sourceAid.subscribe(
function (x) {
console.log('changed!', x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
setTimeout(function() {
observableId = "yrth5yu56uy56";
}, 2000);
答案 0 :(得分:0)
以下是将数据推送到数组的示例
var first = [];
var s1 = new Rx.Subject();
s1.subscribe(first.push.bind(first));
s1.onNext('I');
s1.onNext('am');
setTimeout(function() {
s1.onNext('late');
console.log('late',first);
}, 2000);
console.log('first'first);
如果你运行这个,你会得到
"first"
["I", "am"]
"late"
["I", "am", "late"]
我希望有帮助
答案 1 :(得分:0)
首先,“初始值被记录为一连串字符”的原因是Observable.from
接受一个iterable作为参数。因此,当你传递一个字符串时:它被视为一个数组,每个字符变成一个迭代,其结果是每次记录一个字符。
创建Observable
的最简单方法是使用BehaviorSubject:
var stream = new Rx.BehaviorSubject('test0');
stream.subscribe(hash => console.log(hash));
var testCount = 0;
setInterval(() => stream.next(`test${++testCount}`), 500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>
如果您希望将此可观察对象传递给另一个类或函数,并且不希望它们能够在您的BehaviorSubject上调用next
,则可以使用asObservable
向它们传递一个observable方法:
return stream.asObservable();
现在您可以继续更新您的BehaviorSubject,消费者只能订阅活动,但不能创建新活动。
答案 2 :(得分:-1)
您需要//this is a normal variable. updating anything will not effect observable
var observableId = "hwebd788ew98ew9";
//sourceAid will be an observable and the intitial value will be observableId
var sourceAid = Rx.Observable.from(observableId);
// you are subscribing the value which is good.
var subscriptionAid = sourceAid.subscribe(
function (x) {
console.log('changed!', x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
// here youa re changing observableId which is normal javascript veriable and it has nothing to do with observable
setTimeout(function() {
observableId = "yrth5yu56uy56";
}, 2000);
// you need to eimt/change/add value to 'sourceAid' as it is subscribed and responsible to notify all methods subscribing it for updates.
//this will update
sourceAid.next("yrth5yu56uy56")
将数据推送到所有订阅的方法。
让我解释一下你的问题
{{1}}