我想实现的诺言我自己,但我无法找到解决办法

问题描述 投票:0回答:1

在这里,我想实现“无极”像块。但我不能够设置为结果块。

在这里,我有2个挑战:

  1. 我试图实施从第一次姓和名满弦简单的承诺的例子。
  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)
}
ios swift promisekit
1个回答
1
投票

第一,链之类的东西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)
    }
}

你可以做类似的事情errorfinally如果你喜欢。

为了您的现有代码,您要附加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条款或解决在不同的队列,但可以在一个简单的承诺类型的罚款,只要你记住这一点(和可以极大地简单....)

© www.soinside.com 2019 - 2024. All rights reserved.