我想自己实现承诺,但找不到解决方案

I would like to implement promises my own, but I could not find the solution

这里我想实现 'Promise' 类似的块。但是我无法为块设置结果。

这里我有 2 个挑战:

  1. 我正在尝试实现简单的 Promise 示例以获得完整的 来自名字和姓氏的字符串。
  2. 我想多次调用“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=])
    }
}

如果愿意,您可以做与 errorfinally 类似的事情。

在 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 类型中就可以了请记住这一点(并使其变得更加简单......)