无法在 when(resolved:) 的处理程序中获取数据
Cannot get data in handler for when(resolved:)
PromiseKit 6
我有一个从数据库中获取警报列表的函数,然后我需要在每个警报上使用 contentId 属性 来获取内容并附加到适当的警报项目。
也许有更好的方法,但现在,我想到的是将承诺收集到列表中并调用 when(resolved:)。我选择它是因为如果任何承诺失败,我希望能够 return 所有可以通过的承诺。
在函数 attachContents 中的 then 处理程序中,处理程序通过此类型 [Result] 但是当我映射列表时我可以访问的唯一字段是 isFulfilled
我检查了 Result 的类型并发现了这个:
public enum Result<T> {
case fulfilled(T)
case rejected(Error)
}
public extension PromiseKit.Result {
var isFulfilled: Bool {
switch self {
case .fulfilled:
return true
case .rejected:
return false
}
}
}
它把我带到了第一个,在 Resolver.swift 所以我不确定为什么我不能通过调用 fulfilled
来获取数据
private func getContent(for alert: Model) -> Promise<ViewModel> {
return firstly { () -> Promise<Any> in
if let contentType = AlertContentType(rawValue: alert.type) {
switch contentType {
case .news:
return newsService.get(contentId: contentId, superareaId: superareaId).compactMap { [=11=] as Any }
case .insight:
return insightService.get(contentId: contentId, superareaId: superareaId).compactMap { [=11=] as Any }
}
} else { throw DataError.Missing(error: "Could not retrieve type!") }
}.compactMap { content in
var viewModel = alert.toViewModel()
viewModel.content = content
return viewModel
}
}
private func attachContents(to alerts: [Model]) -> Promise<[ViewModel]> {
return firstly { () -> Guarantee<[Result<ViewModel>]> in
let contentPromises: [Promise<AlertViewModel>] = alerts.map {
return self.getContent(for: [=11=])
}
return when(resolved: contentPromises)
}.then { (vModels: [Result<ViewModel>]) -> Promise<[OIAlertViewModel]> in
vModels.map { (vm: Result<OIAlertViewModel>) in
// vm.isFulfilled is the only accessible property here
// can't call
}
}
}
Result
是 .fulfilled
或 .rejected
的枚举
vModels.map { (vm: Result<OIAlertViewModel>) in
switch vm {
case .fulfilled(let alert):
print(alert)
case .rejected(let error):
print(error)
}
}
PromiseKit 6
我有一个从数据库中获取警报列表的函数,然后我需要在每个警报上使用 contentId 属性 来获取内容并附加到适当的警报项目。
也许有更好的方法,但现在,我想到的是将承诺收集到列表中并调用 when(resolved:)。我选择它是因为如果任何承诺失败,我希望能够 return 所有可以通过的承诺。
在函数 attachContents 中的 then 处理程序中,处理程序通过此类型 [Result] 但是当我映射列表时我可以访问的唯一字段是 isFulfilled 我检查了 Result 的类型并发现了这个:
public enum Result<T> {
case fulfilled(T)
case rejected(Error)
}
public extension PromiseKit.Result {
var isFulfilled: Bool {
switch self {
case .fulfilled:
return true
case .rejected:
return false
}
}
}
它把我带到了第一个,在 Resolver.swift 所以我不确定为什么我不能通过调用 fulfilled
来获取数据private func getContent(for alert: Model) -> Promise<ViewModel> {
return firstly { () -> Promise<Any> in
if let contentType = AlertContentType(rawValue: alert.type) {
switch contentType {
case .news:
return newsService.get(contentId: contentId, superareaId: superareaId).compactMap { [=11=] as Any }
case .insight:
return insightService.get(contentId: contentId, superareaId: superareaId).compactMap { [=11=] as Any }
}
} else { throw DataError.Missing(error: "Could not retrieve type!") }
}.compactMap { content in
var viewModel = alert.toViewModel()
viewModel.content = content
return viewModel
}
}
private func attachContents(to alerts: [Model]) -> Promise<[ViewModel]> {
return firstly { () -> Guarantee<[Result<ViewModel>]> in
let contentPromises: [Promise<AlertViewModel>] = alerts.map {
return self.getContent(for: [=11=])
}
return when(resolved: contentPromises)
}.then { (vModels: [Result<ViewModel>]) -> Promise<[OIAlertViewModel]> in
vModels.map { (vm: Result<OIAlertViewModel>) in
// vm.isFulfilled is the only accessible property here
// can't call
}
}
}
Result
是 .fulfilled
或 .rejected
vModels.map { (vm: Result<OIAlertViewModel>) in
switch vm {
case .fulfilled(let alert):
print(alert)
case .rejected(let error):
print(error)
}
}