【问题标题】:How to use swift-4 Promises then, done, catch and other blocks如何使用 swift-4 Promises then、done、catch 等块
【发布时间】:2018-10-10 00:12:34
【问题描述】:

我想了解 swift-4 中的 Promise。如何使用多个 then 语句和 done, catch 块。

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

这是我的代码。

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)
            }
        }
    }
}

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

我想使用多个 then、done、finally 块。只是想了解用法。

为什么当我们使用 userPromise.then { user -> Void in 时出现错误

我应该在块内给出什么

【问题讨论】:

  • 什么错误?在哪里?请edit您的问题清晰准确。

标签: ios swift swift4 promisekit


【解决方案1】:

在 PromiseKit 6 中,then 不能再返回 Void。这主要是由于 Swift 4 中的元组问题。

引用PromieKit 6 Release News

有了 PromiseKit,我们的 then 做了很多事情,我们依赖 Swift 从上下文推断正确的then。但是有多行 thens 它不会这样做,而不是告诉你 情况模棱两可,它会发明一些其他错误。通常情况下 害怕cannot convert T to AnyPromise。我们有故障排除 解决这个问题的指南,但我相信可以工作的工具,以及何时 你花了 4 年等待 Swift 解决问题而 Swift 没有 解决问题,你怎么办?我们选择在 更高级别。

所以我们将then 拆分为thendonemap

  • then 接受了之前的承诺值,并要求您返回一个承诺。
  • done 被输入之前的承诺值并返回一个 Void 承诺(这是链使用量的 80%)
  • map 提供了先前的承诺值,并要求您返回非承诺,即。一个值。

因此 .then { (user) -&gt; Void in 不再有效,这就是您收到错误消息的原因。
它现在设计为返回 Thenable,如下所示:

userPromise.then { user -> Promise<User> in
    //return yet another promise
}

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

userPromise.done { (user) in
    print(user)
}

所以当你把它们混在一起时:

我们得到:

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)
    }
}

【讨论】:

  • OMG :),我确实误解了你的评论。对不起,谢谢'BRO'
猜你喜欢
  • 2018-01-23
  • 2021-09-21
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2017-12-02
  • 2022-06-12
相关资源
最近更新 更多