Как ожидать нескольких обещаний PromiseKit, которые имеют разную полезную нагрузку? - PullRequest
0 голосов
/ 10 июня 2018

В моем проекте есть множество функций, которые асинхронно извлекают данные из базового источника данных и возвращают результат в виде Promise<T>, где T является необязательным необязательным объектом модели.Мне нужно выбрать 2 различных независимых объектов параллельно.Для этого я попытался использовать функцию when(resolved: [Promise<T>]):

let userPromise: Promise<User> = fetchUser(with: userID)
let documentPromise: Promise<Document> = fetchDocument(with: documentID)

when(resolved: [userPromise, documentPromise]).done {
...
}

Но я получаю сообщение об ошибке Cannot invoke 'when' with an argument list of type '(resolved: [Any])'.Я пытался присвоить обещания явно объявленному массиву:

let promises: [Promise<Any>] = [userPromise, documentPromise]

, но теперь я получаю сообщение об ошибке, что Promise<User> нельзя присвоить Promise<Any>.Честно говоря, я не могу сосредоточиться на этом.В чем проблема?

PS Чтобы упростить понимание, я создал следующий фрагмент:

func getPromise() -> Promise<String> {
   return Promise<String>.pending().promise
}

let promise: Promise<Any> = getPromise()

, который выдает похожую ошибку: Cannot convert value of type 'Promise<String>' to specified type 'Promise<Any>'Есть идеи как это решить?Спасибо!

Среда: PromiseKit 6.2.4, Swift 4.1, Xcode 9.4

1 Ответ

0 голосов
/ 11 июня 2018

when(resolved:) объявлен таким образом, что он принимает обещания только с одним и тем же типом.Вот его подпись:

public func when<T>(resolved promises: Promise<T>...)

Вам особенно нужен не отклоняющий when(resolved:)?Вы пробовали when(fulfilled:_:)?Разница в том, что последний отклоняет, как только одно из предоставленных обещаний отклоняет.

Если возможно использование when(fullfilled:_:), вы можете написать что-то вроде этого:

when(fulfilled: [userPromise, documentPromise])
  .done { user, document in
    // ...
  }
  .catch { error in
    // either of promises has been rejected
    print(error)
  }
...