我想自己实现承诺,但找不到解决方案
I would like to implement promises my own, but I could not find the solution
这里我想实现 'Promise' 类似的块。但是我无法为块设置结果。
这里我有 2 个挑战:
- 我正在尝试实现简单的 Promise 示例以获得完整的
来自名字和姓氏的字符串。
- 我想多次调用“then”。
- 首先我想得到两者的全名。
- 然后转换成大写。
- 然后转换成小写。
..等等(意思是说一些任务的多个'then'条件。)
如何实现多次?
这是我的例子。
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([=10=])
block([=10=])
}
} else {
resultHandler = block
}
}
或者您可以通过使 resultHandler
成为非可选的来简化事情:
private var resultHandler: (T)->() = {}
...
func then(block: @escaping (T)->()) {
resultHandler = { [oldHandler] in
oldHandler([=11=])
block([=11=])
}
}
如果愿意,您可以做与 error
和 finally
类似的事情。
在 Promise 解析后,您将 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([=12=])
block([=12=])
}
}
func resolve(_ value: T) {
self.value = value
resultHandler(value)
resultHandler = {}
final()
final = {}
}
(或者类似的东西。我还没有完全测试过这个。)
请记住,这都是线程不安全的,因此您必须小心添加 .then
子句或解析不同的队列,但只要您在简单的 Promise 类型中就可以了请记住这一点(并使其变得更加简单......)
这里我想实现 'Promise' 类似的块。但是我无法为块设置结果。
这里我有 2 个挑战:
- 我正在尝试实现简单的 Promise 示例以获得完整的 来自名字和姓氏的字符串。
- 我想多次调用“then”。
- 首先我想得到两者的全名。
- 然后转换成大写。
- 然后转换成小写。 ..等等(意思是说一些任务的多个'then'条件。)
如何实现多次?
这是我的例子。
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([=10=])
block([=10=])
}
} else {
resultHandler = block
}
}
或者您可以通过使 resultHandler
成为非可选的来简化事情:
private var resultHandler: (T)->() = {}
...
func then(block: @escaping (T)->()) {
resultHandler = { [oldHandler] in
oldHandler([=11=])
block([=11=])
}
}
如果愿意,您可以做与 error
和 finally
类似的事情。
在 Promise 解析后,您将 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([=12=])
block([=12=])
}
}
func resolve(_ value: T) {
self.value = value
resultHandler(value)
resultHandler = {}
final()
final = {}
}
(或者类似的东西。我还没有完全测试过这个。)
请记住,这都是线程不安全的,因此您必须小心添加 .then
子句或解析不同的队列,但只要您在简单的 Promise 类型中就可以了请记住这一点(并使其变得更加简单......)