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

标签 javascript rxjs

我完全是 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/

相关文章:

javascript - Flex Grid 未在 Orchard CMS 中呈现

angular - 将数据从一个可观察对象传递到另一个可观察对象的正确方法

javascript - Angular 2 : Dynamic synchronous http requests

angular - Jasmine 单元测试 - 无法读取未定义的属性管道

javascript - Angular JS 'route' 与 %2F 的组件不匹配(编码 '/' )

javascript - 意外的响应代码 : 200

javascript - 单击可滚动 div 内的视频按钮,将其向右移动

javascript - 可以将 math.max 用于对象数组吗?

angular - 带有 Angular HttpClient 的 RxJs switchMap

javascript - 使用 rxJS 观察 dom 元素的大小调整