PromiseKit 6.13.1 не может соответствовать 'Thenable', когда я пытаюсь использовать функции Promise <String> - PullRequest
0 голосов
/ 18 июня 2020

Мне чрезвычайно сложно использовать PromiseKit 6.13.1 в очевидной простой ситуации. У меня есть две следующие функции, возвращающие Promise<String>, но я не могу найти способ использовать их с синтаксисом `` сначала {}. Затем {}:

 func promiseGetJWTToken() -> Promise<String> {
    return Promise<String> { seal in
        let error: Error = NSError(domain: "", code: 2000)
        getJWTToken { tokenJWT in
            guard let tokenJWT = tokenJWT else {
                seal.resolve(.rejected(error))
                return
            }
            seal.resolve(.fulfilled(tokenJWT))
        }
    }
}

func promiseGetBEToken() -> Promise<String> {
    return Promise<String> { seal in
        let error: Error = NSError(domain: "", code: 2000)
        getBEToken { result in
            switch result {
            case .success(let response):
                guard let tokenBE = response.token else {
                    seal.resolve(.rejected(error))
                    return
                }
                seal.fulfill(tokenBE)
            case .failure(let error):
                debugPrint(error)
                seal.resolve(.rejected(error))
            case .none:
                seal.resolve(.rejected(error))
            }
        }
    }
}

Когда я пытаюсь использовать следующее

firstly {
   promiseGetJWTToken()
 }.then { tokenJWT in
   // no need go on because I have issues already here         
 }

, я получаю:

Тип '()' не может соответствовать 'Thenable'; только типы struct / enum / class могут соответствовать протоколам

Я тоже пробовал, что происходит из-за автозаполнения:

promiseGetJWTToken().then { token -> Thenable in
    // no need go on because I have issues already here  
}

В этом случае я получаю:

Протокол Thenable может использоваться только как общее c ограничение, потому что у него есть требования к типу Self или связанному типу

Я решил попробовать PromiseKit, потому что у меня есть три сетевых вызова, зависимых друг на друга по каскаду, но я бы не ожидал, что это будет так сложно. Может ли кто-нибудь показать мне, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 18 июля 2020

Сообщение об ошибке вводит в заблуждение; реальная проблема в том, что закрытие .then должно возвращать новый Thenable. В ваших примерах закрытие .then пустое.

Или просто используйте .done, если не цепочки обещаний.

0 голосов
/ 02 сентября 2020

Они заменили использование then { } на done { }.

firstly {
   promiseGetJWTToken()
 }.done { tokenJWT in
   // use your token
 }
0 голосов
/ 03 августа 2020

Вы можете попробовать

 firstly {
   promiseGetJWTToken()
 }.then { tokenJWT -> Promise<String> in
   return promiseGetBEToken()
 }

или

 firstly {
   promiseGetJWTToken()
 }.then { tokenJWT -> Promise<String> in
   promiseGetBEToken() 
   return Promise.value(tokenJWT)
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...