代码之家  ›  专栏  ›  技术社区  ›  Damodar

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

  •  0
  • Damodar  · 技术社区  · 5 年前

    这里我有两个挑战:

    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)
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Rob Napier    5 年前

    首先,像这样的东西链 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 子句或在不同的队列上解析,但在简单的承诺类型中,只要您记住这一点就可以了(并且使它变得非常简单….)