面试题答案
一键面试在PromiseKit中,可以使用when(fulfilled:)
方法来并发执行多个Promise任务,并且可以通过.catch
块来捕获异常。为了保证其他任务继续执行直到完成,可以将每个任务包装在一个try
块中,并在出现异常时返回一个被拒绝的Promise。
以下是示例代码:
import PromiseKit
func task1() -> Promise<Void> {
return Promise { seal in
// 模拟异步任务
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
seal.fulfill(())
}
}
}
func task2() -> Promise<Void> {
return Promise { seal in
// 模拟异步任务
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
// 模拟抛出异常
throw NSError(domain: "com.example", code: 1, userInfo: nil)
}
}
}
func task3() -> Promise<Void> {
return Promise { seal in
// 模拟异步任务
DispatchQueue.global().asyncAfter(deadline: .now() + 3) {
seal.fulfill(())
}
}
}
func runTasks() {
let tasks: [() -> Promise<Void>] = [task1, task2, task3]
let promises = tasks.map { task in
return Promise { seal in
do {
try task().done {
seal.fulfill(())
}.catch { error in
seal.reject(error)
}
} catch {
seal.reject(error)
}
}
}
when(fulfilled: promises).catch { error in
print("捕获到异常: \(error)")
}.finally {
print("所有任务已完成(无论是否成功)")
}
}
runTasks()
在上述代码中:
task1
、task2
和task3
是模拟的异步任务,其中task2
会抛出异常。tasks
数组包含了这三个任务。- 使用
map
方法将每个任务包装在一个新的Promise中,这样即使某个任务抛出异常,也不会影响其他任务的执行。 when(fulfilled: promises)
用于并发执行所有包装后的Promise任务。.catch
块用于捕获任何一个任务抛出的异常。.finally
块用于在所有任务完成(无论成功或失败)后执行一些清理操作。