由 JavaScript 模块 async 启发的异步代码实用工具。
AsyncKit 是
let async = AsyncKit<String, NSError>()
async.parallel(
[
{ done in done(.success("one")) },
{ done in done(.success("two")) }
]) { result in
print(result) // -> success(["one", "two"])
// the success array will equal ["one", "two"] even though
// the second closure had a shorter timeout.
}
async.series(
[
{ done in done(.success("one")) },
{ done in done(.success("two")) }
]) { result in
print(result) // -> success(["one", "two"])
}
var count = 0
async.whilst({ return count < 2 },
{ done in
count += 1
done(.success(String(count)))
}) { result in
print(result) // -> success(Optional("2"))
}
async.waterfall("one",
[
// argument is "one"
{ argument, done in done(.success("two")) },
// argument is "two"
{ argument, done in done(.success("three")) }
]) { result in
print(result) // -> success("three")
}
实例化 AsyncKit
例如
let async = AsyncKit<String, NSError>()
准备过程闭包
例如
let process: AsyncKit<String, NSError>.Process = { done in
request() { object, error in
if error == nil {
done(.success(object))
} else {
done(.failure(error))
}
}
}
将过程闭包传递给 AsyncKit 函数并接收结果
例如
async.parallel([process1, process2]) { result in
switch result {
case .success(let objects):
print(objects)
case .failure(let error):
print(error)
}
}
func parallel(processes: [Process], completion: Result<[T], U> -> ())
并行运行进程,无需等待上一个进程完成。如果任何一个进程传递错误,则立即运行完成闭包,并带有错误的返回结果。一旦所有进程成功完成,完成闭包就会带有一个包含所有成功对象的数组运行。
processes
:一个数组,包含类型为 AsyncKit<T, U>.Process
的闭包。每个闭包都会接受一个闭包,它必须使用成功对象或失败对象执行此闭包。completion
:一个闭包,在所有进程都成功或任何进程失败后运行一次。此闭包接收一个包含所有成功对象或是一个失败对象的返回结果。AsyncKit<String, NSError>().parallel([
{ done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
} else {
done(.success("one"))
}
}, { done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
} else {
done(.success("two"))
}
}
]) { result in
switch result {
case .success(let objects):
print(objects) // -> success(["one", "two"])
// the success array will equal ["one", "two"] even though
// the second closure had a shorter timeout.
case .failure(let error):
print(error)
}
}
func series(processes: [Process], completion: Result<[T], U> -> ())
按序列运行进程,每个进程将在上一个进程完成后运行。如果系列中的进程传递错误,则不会运行更多进程,并且完成闭包立即运行并带有错误的返回结果。否则,当进程成功完成时,完成闭包接收一个含有成功对象的数组作为成功的返回结果。
processes
:一个数组,包含类型为 AsyncKit<T, U>.Process
的闭包。每个闭包都会接受一个闭包,它必须使用成功对象或失败对象执行此闭包。completion
:一个闭包,在所有进程都成功或任何进程失败后运行一次。此闭包接收一个包含所有成功对象或是一个失败对象的返回结果。AsyncKit<String, NSError>().series([
{ done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
} else {
done(.success("one"))
}
}, { done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
} else {
done(.success("two"))
}
}
]) { result in
switch result {
case .success(let objects):
print(objects) // -> success(["one", "two"])
case .failure(let error):
print(error)
}
}
func whilst(test: () -> Bool, _ process: Process, completion: Result<T?, U> -> ())
反复调用 process
,直到 test
返回 true。当停止或发生错误时调用完成。
test
:在每次执行 process 之前进行的一个测试。process
:一个闭包,每次测试通过时都会被调用。该闭包被传递一个闭包,该闭包必须在完成并带有结果时调用。completion
:一个闭包,在测试闭包失败并且 process 的重复执行停止后运行。该闭包得到一个包含可选的成功对象(传递给最终 process 的闭包)或错误对象的的结果。var count = 0
AsyncKit<String, NSError>().whilst({
return count < 2
},
{ done in
count += 1
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: count, userInfo: nil)))
} else {
done(.success(String(count)))
}
}) { result in
switch result {
case .success(let object):
print(object) // -> Optional("2")
case .failure(let error):
print(error)
}
}
func waterfall(argument: T, _ processes: [ProcessWithArgument], completion: Result<T, U> -> ())
按顺序运行 processes 的 Tasks 数组,每个执行完成将结果传递到下一个。但是,如果任何一个 process 传递错误,则不会执行下一个 process,并且立即以错误运行 completion 闭包。
argument
:一个第一个参数。process
:一个包含类型为 AsyncKit<T, U>.ProcessWithArgument
的闭包数组的数组。每个闭包都接受一个参数和一个闭包,该闭包必须在完成时(无论是成功还是失败)被调用。成功对象将是下一个 process 的参数。completion
:一个闭包,一旦所有 process 成功或者任何一个 process 失败后就运行。该闭包得到一个包含最终 process 的成功对象或错误对象的结果。AsyncKit<String, NSError>().waterfall("one",
[
// argument is "one"
{ argument, done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
} else {
done(.success("two"))
}
},
// argument is "two"
{ argument, done in
if arc4random_uniform(4) == 0 {
done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
} else {
done(.success("three"))
}
}
]) { result in
switch result {
case .success(let object):
print(object)
case .failure(let error):
print(error)
}
}
Swift 3.0
Yuki Mishima,[email protected]
AsyncKit 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。