Как использовать swift-4 Promises тогда, готово, лови и другие блоки - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы узнать об обещаниях в swift-4. Как использовать несколько операторов затем и готово, ловить блоки.

Здесь я пытаюсь получить значение из обещания. Но я получаю ошибки. Может ли кто-нибудь помочь мне понять обещания?

Вот мой код.

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.

Я хотел бы использовать несколько блоков затем, готово, наконец. Просто хочу понять использование.

Почему я получаю ошибку здесь, когда мы используем userPromise.then {user -> Void in

что я должен дать внутри блока

1 Ответ

0 голосов
/ 30 апреля 2018

В PromiseKit 6 then больше не может возвращать Void. В основном это связано с проблемой tuplegate в Swift 4.

Цитата из Новости выпуска PromieKit 6

С PromiseKit наш then сделал несколько вещей, и мы полагались на Swift вывести правильный then из контекста. Однако с несколькими линиями then s, он не сможет этого сделать, и вместо того, чтобы сказать вам, что Ситуация была неоднозначной, она изобрела бы еще одну ошибку. Часто страшно cannot convert T to AnyPromise. У нас есть устранение неполадок руководство по борьбе с этим, но я верю в инструменты, которые просто работают, и когда вы потратили 4 года на то, чтобы Swift решил проблему, а Swift не исправить проблему, что ты делаешь? Мы решили найти решение на более высокий уровень.

Итак, мы разбили then на then, done и map.

  • then передается предыдущее значение обещания и требует, чтобы вы вернули обещание.
  • done получает предыдущее значение обещания и возвращает обещание Void (что составляет 80% от использования цепочки)
  • map передается предыдущее значение обещания и требует, чтобы вы вернули не обещание, т.е. значение.

Следовательно, .then { (user) -> Void in больше не действителен, и поэтому вы получаете сообщение об ошибке.
Теперь он предназначен для возврата Thenable примерно так:

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

.then, который раньше возвращал Void, теперь является его собственным .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)
    }
}
...