延迟在rxjs中意味着什么?

时间:2017-12-19 15:46:09

标签: javascript rxjs rxjs5

第一个例子

  • 在dom中输入#输入,在div#字段中显示inputElem中输入的内容
  • 然后订阅

    1. 当我输入{..v.a..b.l.e}时,div#字段在预期的5s后显示value
    2. 然后我停一会儿,然后在输入
    3. 中输入{.of..this。}
    4. IMO延迟已经执行,因此valueofthis应该立即出现,但实际上并非如此。什么'这个问题?
第二个例子中的

这两个例子之间有什么不同?

const Observable = Rx.Observable

const inputElem = document.getElementById('input')
const fieldElem = document.getElementById('field')
const inputTexts = Observable.fromEvent(inputElem, 'input')
                              .map(e => e.target.value)
                              .delay(5000)



inputTexts.subscribe(x=> fieldElem.textContent=x , 
                           ()=> {},
                           ()=> {console.log('completed')})


//2.
   var values = Observable.of(1,2,4,8)
                          .map(v => 2*v)
                          .delay(4000)

   values.subscribe(x => console.log(x))

2 个答案:

答案 0 :(得分:1)

delay运算符与所有Rx运算符一样,通过返回应用运算符函数的 new Observable来工作。它不会改变源Observable本身。

因此,在第二个示例中,将delay应用于values的行实际上没有任何效果。

   var values = Observable.of(1,2,4,8)
                          .map(v => 2*v)
   values.delay(4000) // Oops! we've lost the Observable returned from `delay`
   values.subscribe(x => console.log(x)) // prints without delay

您需要使用从delay返回的Observable才能使其表现得像您期望的那样。这通常通过链接来完成,例如:

   var values = Observable.of(1,2,4,8)
                          .map(v => 2*v)
                          .delay(4000)  // values gets return value of delay
   values.subscribe(x => console.log(x)) // prints to console after 4s

答案 1 :(得分:0)

documentation for delay说:

  

...此运算符时间将源Observable移动了该数量   时间以毫秒表示。 之间的相对时间间隔   值保留

在您的第一个示例中,源Observable发出两个“输入”事件(值):第一次更改值时发出的一个(在时间t = 0时),然后在几秒钟后发出一个(在t处) = n)当你下次更改它时。 delay运算符会导致它们延迟相同的时间(5秒),因此您会看到它们在t =(0 + 5)= 5和t =(n + 5)时到达您的订阅者。第二个事件的延迟时间与第一个相同,因此它们相隔n秒。

在第二个示例中,Observable.of几乎完全在同一时间(t = 0)发出每个值。完成delay后,结果值会在t = 4时几乎同时到达您的订阅者。