ios - promise 套件 : compose two promises into one

标签 ios swift promisekit

给定以下方法:

func loadFromCache(url: URL) -> Promise<Array<StockItem>>
func loadFromNetwork(url: URL) -> Promise<Array<StockItem>>

我已经实现了一个返回新 promise 的方法,首先尝试缓存,然后是网络

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<Array<StockItem>> {

    let url = self.urlFor(skip: skip, query: query, onlyInStock: onlyInStock)
    print("Loading: \(url)")

    return Promise { fulfill, reject in
        self.loadFromCache(url: url).then { (items) in
            return fulfill(items)
        }.catch { (error) in
            self.loadFromNetwork(url: url).then { (items) in
                fulfill(items)
            }.catch { (error) in
                reject(error)
            }
        }
    }
}

我想上面的方法一定有更好的写法。在没有嵌套闭包的情况下,我如何将它写成一个合适的 promise 链?

换句话说,我怎样才能将两个 promise 合二为一?

最佳答案

您正在寻找的是 recover 运算符。

func load(skip: Int, query: String?, onlyInStock: Bool = false) -> Promise<[StockItem]> {
    let url = urlFor(skip: skip, query: query, onlyInStock: onlyInStock)
    return loadFromCache(url: url).recover { _ in
        return loadFromNetwork(url: url)
    }
}

关于ios - promise 套件 : compose two promises into one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43939069/

相关文章:

javascript - 在 iOS 8.4.1 上使用 Cordova 无法打开链接(和点击)

ios - AVCaptureSession 图像尺寸(使用 GPUImage)

swift - 在 SwiftUI View 中实现委托(delegate)

ios - 条件绑定(bind)的初始化程序必须具有可选类型

ios - PromiseKit 和 CloudKit 保存(使用 Swift)

iphone - 在 iOS 上使用 CoreData 处理类似于多个文档的东西

ios - 解析 PFQuery 谓词指针对象

ios - 如何实现 URLSessionDelegate 以允许自签名证书? (iOS/swift )

swift - 如何利用 PromiseKit 确保在继续之前检索到查询的对象?

iOS PromiseKit 和 CoreData NSManagedObjectContext