首先,像这样的东西链
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
在现有代码中附加
然后
在承诺解决之后。你必须处理好那个案子。你可以用枚举来实现
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
子句或在不同的队列上解析,但在简单的承诺类型中,只要您记住这一点就可以了(并且使它变得非常简单….)