我完全是 RxJS 的初学者,我想做的是某种伪代码,其中我有初始字符串值,然后一段时间后它会被异步请求更改到服务器(在我的代码中下面我只是使用超时函数在一段时间后更改初始值以模仿对服务器的请求)。
如何正确创建Observer并订阅这个任务呢?我写了一些代码,但真的不知道它是否是正确的方法,如果有人会审查它并告诉我真相,我将不胜感激 :) 还有其他一些达到预期结果的方法将帮助我理解发生了什么在这里。
CodePen - http://codepen.io/anon/pen/grbaVw
var observableId = "11111111111";
var sourceAid = Rx.Observable.create(function (observer) {
observer.onNext(observableId);
});
var subscription = sourceAid.subscribe(
function () {
console.log("Initial value: " + observableId);
setTimeout(function() {
observableId = "22222222";
console.log("New value from server: " + observableId);
}, 2000);
});
最佳答案
简单的方法:使用主题
解决问题的一种方法是使用 Subject:RXJS 中的 Subject 可以被视为 Observable;但是,它还有一个 onNext 方法,允许我们将新数据推送到可观察序列上。我们可以执行以下操作:
var subject = new Rx.Subject();
var subscription = subject.subscribe(function (item) {
console.log("Incoming item: " + item);
});
// We can push data immediately:
subject.onNext('First item');
// And at some later time, we can react to an asynchronous event as long
// as the event's callback has access to our subject:
setTimeout(function () {
subject.onNext('NEW DATA');
}, 1000);
// The output of our program will be:
>> Incoming item: First item
>> Incoming item: NEW DATA
首选方法:将请求视为可观察的流
首选方法是将您的异步请求实际视为数据流(哇,太酷了!)。在 RXJS 中,promises 可以被视为一个可观察的序列,它将发出单个项目(已解析的数据:在您的情况下为网络响应)或单个错误。
假设您正在从服务器检索 friend 列表:getFriendsList 是一个返回 Promise 的函数,该 Promise 在数据加载后解析该数据。我们可以做到以下几点:
// Convert a web request Promise to a stream
var requestPromise = getFriendsList();
var response$ = Rx.Observable.fromPromise(requestPromise);
// Subscribe to the response$ stream
response$.subscribe(function (friends) {
console.log('friends loaded:', friends);
});
如果你需要有一个初始值,你可以使用 .startWith 函数来指定你的初始数据:
// Convert a web request Promise to a stream
var requestPromise = getFriendsList();
var response$ = Rx.Observable.fromPromise(requestPromise)
// Start with an empty friend's list
startWith([]);
// Subscribe to the response$ stream
response$.subscribe(function (friends) {
console.log('friends loaded:', friends);
});
关于javascript - RxJS - 订阅字符串值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706265/