在这里,我想实现“无极”像块。但我不能够设置为结果块。
在这里,我有2个挑战:
我如何能实现多次?
这里是我的榜样。
class Promise<T> {
private var resultHandler : ((_ result:T)->())?
private var errorHandler : ((_ error:String)->())?
private var final : (()->())?
func resolve(_ value: T) {
resultHandler?(value)
final?()
}
func reject(_ value: String) {
errorHandler?(value)
final?()
}
func then(_ block:@escaping (_ result:T)->()) {
resultHandler = block
}
func error(_ block:@escaping (_ result:String)->()) {
errorHandler = block
}
func finally(_ block:@escaping ()->()) {
final = block
}
}
func getFullName(firstname: String, lastname: String) -> Promise<String> {
let p = Promise<String>()
if firstname.count > 0 && lastname.count > 0 {
let name = firstname + " " + lastname
p.resolve(name)
}
else {
print("--")
p.reject("Firstname and Lastname can't be empty" )
}
return p
}
let p = getFullName(firstname: "Alen", lastname: "Stel")
p.then { (name) in
print("Name", name)
}
第一,链之类的东西then
,你需要链中的处理程序,例如:
func then(block: @escaping (T)->()) {
if let oldHandler = resultHandler {
resultHandler = {
oldHandler($0)
block($0)
}
} else {
resultHandler = block
}
}
或者你也可以简化通过使resultHandler
非可选件事情:
private var resultHandler: (T)->() = {}
...
func then(block: @escaping (T)->()) {
resultHandler = { [oldHandler] in
oldHandler($0)
block($0)
}
}
你可以做类似的事情error
和finally
如果你喜欢。
为了您的现有代码,您要附加then
许是解决后。你必须要管理这种情况。你可以这样做与枚举State
(如.pending
,.resolved
,.error
),或者只是使用一些变量,如:
private var value: T?
...
func then(block: @escaping (T)->()) {
if let value = value {
block(value)
} else {
resultHandler = { [oldHandler] in
oldHandler($0)
block($0)
}
}
func resolve(_ value: T) {
self.value = value
resultHandler(value)
resultHandler = {}
final()
final = {}
}
(或者类似的规定,我还没有完全测试这一点。)
请记住,这是所有线程安全的,所以你必须要小心添加.then
条款或解决在不同的队列,但可以在一个简单的承诺类型的罚款,只要你记住这一点(和可以极大地简单....)