如何理解此可观察到的超时示例代码?

时间:2018-09-11 01:01:49

标签: reactjs observable

我是ReactX JS的初学者。以下是与站点http://reactivex.io/documentation/operators/timeout.html中给出的超时相关的示例代码。我不明白网站上的解释。有人能用简单的言语和逻辑解释吗?

主要问题是:

  1. 为什么outputs0, 1, 2而不是200, 300, 350
  2. 0, 1, 2分别对应于200, 300 ,350吗?
  3. Rx.Observale是什么意思? Rx来自哪里?
  4. map运算符返回ii是否等于0, 1, 2
  5. Rx.Observale.for().map().timeoutWithSelector()想要什么     要做?

示例代码

var array = [
    200,
    300,
    350,
    400
];

var source = Rx.Observable
    .for(array, function (x) {
        return Rx.Observable.timer(x);
    })
    .map(function (x, i) { return i; })
    .timeoutWithSelector(function (x) {
        return Rx.Observable.timer(400);
    });

var subscription = source.subscribe(
    function (x) { console.log('Next: ' + x); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });

输出:

Next: 0
Next: 1
Next: 2
Error: Error: Timeout

1 个答案:

答案 0 :(得分:1)

Rx是一个图书馆。 Observable的用法类似于Promise,因为它们都用于异步任务/请求。

解释代码:

源变量是一个Observable。源Observable在var订阅行上进行了订阅,由于它是lazy,因此在被订阅之前,不会触发/调用Observable。订阅将三个函数作为参数,第一个成功,第二个错误,最后一个完成。

一旦订阅了源,就从for循环遍历给定数组。给定的函数与数组中的每个元素一起调用。因此,在这种情况下,对于数组中的每个元素,都会返回一个Observable,并且计时器意味着在给定的时间(现在为+ x)下,Observable将发送一个从0开始并每次递增的数字。因此,对于第一个元素200,Observable将等待200,然后返回0。对于下一个元素300,Observable将等待300,然后返回1。这将对整个数组继续进行。

map函数,返回的值是x,i是一个增量器。因此,它将首先是0、0,然后是1、1,然后继续进行数组操作。

timeoutWithSelector表示,如果Observable在给定函数之前未完成,则将引发错误。

因此它输出0、1、2,错误,因为只有数组中的前3个元素在400之前完成。0在200之前完成,1在100以后完成(300-200),然后2在50之后完成(350-100) -200)。在400处引发错误,并且Observable停止。因此,它永远不会完成,因此,不会打印“已完成”。

希望这会有所帮助。