从字符串订阅Rx.Observable不能处理值赋值

时间:2016-02-26 06:50:16

标签: javascript rxjs

这是一个基本的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);

3 个答案:

答案 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

的最简单方法
  1. 有初始值。
  2. 可以随时间传递更多值
  3. 是使用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}}