PromiseKit for In Loop 实现时
PromiseKit For In Loop When Implementation
使用 Swift
,我第一次尝试使用 PromiseKit
将 promises 合并到我的代码中,但我很难从语法上理解如何实现它。
我的目标是将数据请求通过管道传输到 Firebase
,并在附加数组中包含所有返回数据后执行另一个方法。似乎 promise
已解决,最终方法是 运行 在数组设置数据之前。我相信我应该使用 "when",但不可否认在理解文档方面有困难。
略写,相关代码如下:
getPosts(ids).done {
runningFinalMethod(self.arr)
}
func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise { seal in
for id in ids {
db.collection("data").whereField("id", isEqualTo: id).getDocuments(completion: { (dataForId, error) in
appendData(dataForId)
})
}
seal.fulfill(())
}
}
func appendData(_ dataForId: [data]) {
arr.append(contentsOf: dataForId)
}
在这种异步映射多个值的情况下,最好使用 thenMap
。这是实现此目标的方法
func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise.value(ids).thenMap { id in
Promise<data> { resolver in
db.collection("data").whereField("id", isEqualTo: id).getDocuments { dataForId, error in
guard let error = error else { resolver.fulfill(dataForId) }
resolver.reject(error)
}
}
}
.done { allDataForIds in
self.arr = allDataForIds
}
.catch { error in
// handle error
}
}
thenMap
允许您映射单个值,然后使用 Promise
处理该值。然后,您可以使用 done
方法收集所有值,该方法具有来自每个收集承诺的所有值。顺便说一下,done
方法本身 returns Promise<Void>
,你可以简单地 return 最后的那个。
使用 Swift
,我第一次尝试使用 PromiseKit
将 promises 合并到我的代码中,但我很难从语法上理解如何实现它。
我的目标是将数据请求通过管道传输到 Firebase
,并在附加数组中包含所有返回数据后执行另一个方法。似乎 promise
已解决,最终方法是 运行 在数组设置数据之前。我相信我应该使用 "when",但不可否认在理解文档方面有困难。
略写,相关代码如下:
getPosts(ids).done {
runningFinalMethod(self.arr)
}
func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise { seal in
for id in ids {
db.collection("data").whereField("id", isEqualTo: id).getDocuments(completion: { (dataForId, error) in
appendData(dataForId)
})
}
seal.fulfill(())
}
}
func appendData(_ dataForId: [data]) {
arr.append(contentsOf: dataForId)
}
在这种异步映射多个值的情况下,最好使用 thenMap
。这是实现此目标的方法
func getPosts(_ ids: [String]) -> Promise<Void> {
return Promise.value(ids).thenMap { id in
Promise<data> { resolver in
db.collection("data").whereField("id", isEqualTo: id).getDocuments { dataForId, error in
guard let error = error else { resolver.fulfill(dataForId) }
resolver.reject(error)
}
}
}
.done { allDataForIds in
self.arr = allDataForIds
}
.catch { error in
// handle error
}
}
thenMap
允许您映射单个值,然后使用 Promise
处理该值。然后,您可以使用 done
方法收集所有值,该方法具有来自每个收集承诺的所有值。顺便说一下,done
方法本身 returns Promise<Void>
,你可以简单地 return 最后的那个。