value
在5s之后如预期
然后我停了一会儿然后在输入中键入{.of..this。}
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))
与所有Rx运算符一样,delay运算符通过返回应用运算符函数的新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
...此运算符时间将源Observable移动了以毫秒表示的时间量。保留值之间的相对时间间隔。
在您的第一个示例中,源Observable发出两个“输入”事件(值):一个在您第一次更改值时发出(在时间t = 0时),然后在几秒钟后发出一个(在t = n时)当你下次改变它。 delay
运算符会使它们都延迟相同的时间(5秒),因此您可以看到它们在t =(0 + 5)= 5和t =(n + 5)时到达您的订户。第二个事件的延迟时间与第一个事件的数量相同,因此它们仍将是n
秒。
在第二个例子中,Observable.of
在几乎完全相同的时间(t = 0)发出它的每个值。在经过delay
之后,结果值在t = 4时几乎同时到达您的订户。