RxJS - 订阅字符串值的正确方法

RxJS - Correct approach to do subscription for string value

我完全是 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 可以被视为一个可观察的序列,它将发出单个项目(已解析的数据:在您的情况下为网络响应)或单个错误。

让我们假设您正在从服务器检索朋友列表:getFriendsList 是一个函数,returns 一个 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);
});