SwiftPromises 2.0.1

SwiftPromises 2.0.1

Wyatt MufsonWyatt MufsonRoss Krasner 维护。



  • WyattMufson

SwiftPromises

Swift 的轻量级 Promise 包

Build Status codecov Version License Platform

概览

SwiftPromises 是一个轻量级包,用于在原生 Swift 中实现 Promise。它没有任何子依赖,旨在用最少的代码增加 Promise 支持。

Promise 是一个表示异步操作最终完成/失败的对象。虽然它在某些语言中是原生支持的,但 Swift 目前还没有原生支持。

Pierre Felgines 的文章 "Implementing Promises in Swift"Khanlou 的 Promise 库Google 的 Promises 框架 启发。

安装

SwiftPromises 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod 'SwiftPromises'

然后运行 pod install

使用示例

创建Promise

以下代码定义了一个Promise,它将会解析为值15

let promise = Promise<Int> (15)

...

let promise = Promise<Int> {
  return 15
}

...

let promise = Promise<Int> { resolve, _ in
  resolve(15)
}

Promise也可以通过Error对象进行拒绝。

let error = NSError(domain: "Error", code: -500, userInfo: [:])

let promise = Promise<Int> (error)

...

let promise = Promise<Int> {
  return error
}

...

let promise = Promise<Int> { _, reject in
  reject(error)
}

Then

Then函数可以用来处理已解析的Promise。

let promise = Promise<Int> { resolve, _ in
  resolve(1)
}

promise.then { (num) in
  print(num) // Prints 1
}

Catch

Catch函数可以用来处理Promise中的异常。

let promise = Promise<Bool> { _, reject in
  reject(NSError(domain: "Error", code: -500, userInfo: [:]))
}

promise.catch { err in
  let err = err as NSError
  let message = err.domain
  print(message) // Prints "Error"
}

链式调用

Promise可以被链式调用。

func work1(_ string: String) -> Promise<String> {
  return Promise { resolve, _ in
    resolve(string)
  }
}

func work2(_ string: String) -> Promise<Int> {
  return Promise { resolve, _ in
    resolve(Int(string) ?? 0)
  }
}

func work3(_ number: Int) -> Int {
  return number * number
}

work1("10").then { string in
  return work2(string)
}.then { number in
  return work3(number)
}.then { number in
  print(number) // Prints 100
}

All

可以使用All函数并行调用Promise数组。All返回一个新的Promise,该Promise返回一个包含解析值的数组。如果数组中的某个Promise抛出错误,All将调用其Catch函数。

let promise = Promise<Int> { resolve, _ in
  resolve(15)
}

let promise2 = Promise<Int> { resolve, _ in
  resolve(4)
}

all([promise, promise2]).then { (numbers) in
  var total = 0
  for number in numbers {
      total += number
  }
  print(total) // Prints 19
}.catch { (err) in
  // Not called in this example
}

等待

等待函数可以用来同步调用Promise。

let promise = Promise<Int> { resolve, _ in
  DispatchQueue.global().asyncAfter(deadline: .now() + 1, execute: {
    resolve(1)
  })
}

guard let value = try? await(promise: promise) else { return }

print(value) // Prints 1 after one second has passed

请注意,等待函数应当仅在全局线程中调用,以防止死锁。

贡献

我们欢迎为SwiftPromises做出贡献的开发者。在开始之前,请查阅我们的贡献指南

作者

WyattMufson - Ryu Games联合创始人

许可

SwiftPromisesMIT许可下可用。