$scope.AddToTotal = function() {
var total = 0;
for (var i = 0; i < $scope.items.length; i++) {
if ($scope.items[i].myOperation === 'Add') {
total += $scope.items[i].myNumber;
} else if ($scope.items[i].myOperation === 'Divide') {
total /= $scope.items[i].myNumber;
} else if ($scope.items[i].myOperation === 'Subtract') {
total -= $scope.items[i].myNumber;
} else if ($scope.items[i].myOperation === 'Multiply') {
total *= $scope.items[i].myNumber;
}
}
return total;
}
我在RxSwift中看到了一些代码,但我无法理解为什么需要func signup(_ username: String, password: String) -> Observable<Bool> {
// this is also just a mock
let signupResult = arc4random() % 5 == 0 ? false : true
return Observable.just(signupResult)
.concat(Observable.never())
.throttle(0.4, scheduler: MainScheduler.instance)
.take(1)
}
答案 0 :(得分:1)
我自己也理解这一点,所以请你带上一粒盐:)
.throttle(0.4, scheduler: MainScheduler.instance)
发出一次值并立即完成;它几乎没有时间; concat(Observable.never())
将时间引入序列,使用0.4s +确定要返回的值,throttle
使输入序列长时间运行,因此return Observable.just(signupResult)
首先要做的事情。现在throttle
足以实现该功能。剩下的好处是什么?
其他三个运营商导致延迟。由于连接的Observable永无止境,take(1)
将等待至少0.4秒一次,以确定为第一个节流的&#34; chunk&#34;发出哪个值。 "analyzer": {
"ipv4analyzer": {
"tokenizer": "ipv4tokenizer"
}
},
"tokenizer": {
"ipv4tokenizer": {
"pattern": "([0-9]{1,3})",
"type": "pattern",
"group": "1"
}
}
然后在0.4s
对我而言,这似乎是实施延迟回应的一种非常费力的方式:)
答案 1 :(得分:0)
这只是一个例子。 FUI,never
创建一个不发出任何项目且不终止的Observable(来自official documentation的描述)
答案 2 :(得分:0)
@ctietze的回答似乎是正确的。但经过测试,我意识到throttle
杀死了整个概念。
基本上throttle
将在可观察的开始之后立即返回值。这意味着它不会等到0.4s
发出第一个值。
func testWithThrottle() -> Observable<Int> {
return
Observable.just(7) // 1
.concat(Observable.never()) // 2
.throttle(3.0, scheduler: Schedulers.background) // 3
.take(1) // 4
// 1. -7--|->
// 2. -7------------------------------->
// 3. -7------------------------------->
// 4. -7--|->
}
...
print("[\(Date())] Start!")
testWithThrottle().subscribe({ (event) in
print("[\(Date())] event: \(event)")
}).addDisposableTo(disposeBag)
print("[\(Date())] End!")
...
[2017-06-03 03:14:00 +0000] Start!
[2017-06-03 03:14:00 +0000] event: next(7)
[2017-06-03 03:14:00 +0000] event: completed
[2017-06-03 03:14:00 +0000] End!
那么,解决方案是什么?很简单,您需要使用debounce
。
func testWithDebounce() -> Observable<String> {
return
Observable.of("A") // 1
.concat(Observable.never()) // 2
.debounce(3.0, scheduler: Schedulers.background) // 3
.take(1) // 4
// 1. -A-|->
// 2. -A------------------------------>
// 3. ---------------A---------------->
// 4. ---------------A-|->
}
...
[2017-06-03 03:24:21 +0000] Start Thrrotle!
[2017-06-03 03:24:21 +0000] Finish Thrrotle!
[2017-06-03 03:24:24 +0000] event: next(A)
[2017-06-03 03:24:24 +0000] event: completed