如何使用swift-4 Promises then,done,catch和其他块

Dam*_*dar 2 ios swift promisekit swift4

我想了解swift-4中的承诺.如何使用多个then语句并完成,捕获块.

在这里,我试图从承诺中获得价值.但是我收到了错误.有人可以帮我理解承诺吗?

这是我的代码.

import UIKit
import PromiseKit

struct User {
    var firstname : String?
    var lastname  : String?
}

struct APIError {
    var message : String?
}

class ViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let userPromise : Promise = self.getUserDetails()
        userPromise.then { user -> Void in
            //print(user.f)
        }
    }

    func getUserDetails()->Promise<User> {
        return Promise<User> { resolve in
            let user  = User(firstname: "Scot", lastname: "dem")
            if ((user.firstname?.count) != nil) {
                resolve.fulfill(user)
            } else {
                let error = APIError(message: "User not valid")
                resolve.reject(error as! Error)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我得到用户详细信息,我想创建一个全名,大写承诺依赖于userPromise.

我想使用多个then,done,finally块.只是想了解用法.

为什么我在使用userPromise.then {user - > Void in

我应该在街区内给出什么

sta*_*Man 13

在PromiseKit 6中,then无法再返回Void.这主要是由于Swift 4中的tuplegate问题.

引用来自PromieKit 6发布新闻

使用PromiseKit我们then做了很多事情,我们依靠Swift then从上下文中推断出正确的.然而,对于多行 then,它将无法做到这一点,而不是告诉你情况不明确,它会发明一些其他错误.经常是可怕的cannot convert T to AnyPromise.我们有一个故障排除指南来解决这个问题,但我相信工具才能正常工作,当你花费4年时间等待Swift解决问题并且Swift无法解决问题时,你会怎么做?我们选择在更高层次上找到解决方案.

所以我们分成thenthen,donemap.

  • then 被提供先前的承诺价值并要求您返回承诺.
  • done 被提供前一个承诺值并返回一个Void承诺(这是链使用的80%)
  • map是先前的承诺价值,并要求你返回一个非承诺,即.一个值.

因此.then { (user) -> Void in不再有效,这就是您收到错误的原因.
它现在设计为返回Thenable如此:

userPromise.then { user -> Promise<User> in
    //return yet another promise
}
Run Code Online (Sandbox Code Playgroud)

.then以前返回Void,现在它自己.done.
即:

userPromise.done { (user) in
    print(user)
}
Run Code Online (Sandbox Code Playgroud)

所以当你混淆时:

我们得到:

userPromise
    .then { (user) -> Promise<User> in
        //return another Promise
        return self.uppercasePromise(on: user)
    }
    .done { (user) in
        /*
         Depending on your sequence, no more promises are left 
         and you should have a matured user object by now
         */
        print(user)
    }
    .catch { (error) in
        print(error)
    }
    .finally {
        print("finally")
    }

func uppercasePromise(on user: User) -> Promise<User> {
    /*
     Didn't understand your statement but do whatever you meant when you said:

     "Once I get the user details I want to make a full name, "
     uppercase promises which are dependent on userPromise."
     */
    return Promise { seal in
        seal.fulfill(user)
    }
}
Run Code Online (Sandbox Code Playgroud)