我在我的项目中使用PromiseKit,我需要对API进行批量/多次调用并等待所有响应。有什么办法吗?我对PromiseKit很陌生,在他们的Github上没有找到任何关于这个的东西(可能没有看到或理解它)
我现在正在尝试和失败的是:
let ids = [1, 2, 3, 4, 5]
firstly {
getURLPathsFor(ids) // maybe I'm doing this wrong - this returns a Promise<[String]>
}.thenMap { url in
ApiManager.shared.request(url, method: .delete)
}.done { _ in
seal.fulfill(())
}.catch { error in
seal.reject(error)
}
func getURLPathsFor(_ ids: [UInt]) -> Promise<[String]> {
let path = "/somePath"
var URLs = [String]()
return Promise { seal in
ids.forEach { uid in
AppConfigManager.shared.getApiUrl(path: path, uid).done { url in
URLs.append(url)
seal.fulfill(URLs)
}.catch { error in
seal.reject(error)
}
}
}
}
任何帮助将是伟大的,真的坚持这一个。
所以我设法实现了批处理调用,我想使用PromiseKit和处理所有错误在一起:
private func batchDeleteItem(with itemId: UInt) -> Promise<(UInt, AppError?)> {
return Promise { seal in
firstly {
AppConfigManager.shared.getApiUrl(path: Constants.Api.deleteItemRequestPath, itemId)
}.then { url in
ApiManager.shared.request(url, method: .delete)
}.done { _ in
seal.fulfill((itemId, nil))
}.catch { error in
guard let appError = error as? AppError else {
seal.reject(error)
return
}
seal.fulfill((itemId, appError))
}
}
}
我在map中调用这个方法,为了收集不能被删除的项目的id,我也用fill来处理catch——只拒绝服务器端错误(这就是我的情况所需要的):
return Promise { seal in
let promises = ids.map { itemId in
batchDeleteNode(with: itemId)
}
when(fulfilled: promises).done { results in
seal.fulfill(results)
}.catch { error in
seal.reject(error)
}
}
将所有错误分组并等待,我使用when(fulfilled: promises).done {...}
我不是说它是完美的,但似乎工作得很好,我在这个过程中学到了很多关于PromiseKit。