我是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);
});
答案 0 :(得分:2)
解决问题的一种方法是使用主题:RXJS中的主语可被视为可观察者;但是,它还有一个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
首选方法是将异步请求实际视为数据流(WOW COOL!)。在RXJS中,promises可以被视为一个可观察的序列,它将发出单个项目(已解析的数据:您的案例中的Web响应)或单个错误。
让我们假装您正在从服务器中检索朋友列表:getFriendsList是一个函数,它返回一个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);
});