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