swift3 - 在 PromiseKit 6 中正确链接多个 Promise

标签 swift3 promisekit

我正在使用 Promisekit 6 并定义了 3 个函数,所有这些函数都返回 Promise。 第一个从本地数据库获取数据,第二个从在线 API 服务器获取数据。第三个,Foo,检查给定id的数据本地是否存在,否则在线检查并返回。

我无法弄清楚如何正确链接 promise 。以下是我到目前为止的想法,但我不确定创建一个新的 promise 是否是一个好主意。 如有任何反馈,我们将不胜感激。 谢谢:)

func daoClient.get(id: String) -> Promise<Any> {
    return Promise { seal in
        do {
            let realm = try Realm()
            if let data = realm.object(ofType: DataEntity.self, forPrimaryKey: id) {
                seal.fulfill(alert)
            } else {
                seal.reject(Errors.DataError(error: "no data found with id \(id)"))
            }
        } catch {
            seal.reject(error)
        }
    }
}

func apiClient.get(id: String) -> Promise<swiftyJson.JSON> {
    return self.oiRequestClient.request(self.endpoint, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil)
        .responseJSON()
        .compactMap { (arg) -> JSON? in
            let json = JSON(arg.json)

            if let response = arg.response.response, response.statusCode > 399 {
                let error = json["error"].dictionary?.description
                throw Errors.NetWorkError(error: error)
            } else {
                return json
            }
        }
}


func Foo(id: String) -> Promise<Any> {
    return Promise { seal in
        daoClient
            .get(id: id)
            .done { data in
                seal.fulfill(data)
            }.recover { (error: Error) in
                return self.apiClient
                .get(id: id)
                .done { data in
                    seal.fulfill(data)
                }
            }.catch { error in
                seal.reject(error)
            }
    }
}

最佳答案

您没有处理“恢复”中的错误,在我看来,这是一种奇怪的模式,无论如何,最好不要像您那样包装 promise ,并像这样“垂直”链接更多:

func Foo(id: String) -> Promise<Any> {
    return firstly {
        return daoClient.get(id: id)
    }.compactMap { data in
        return data
    }.recover { _ -> Promise<swiftyJson.JSON> in
        return self.apiClient.get(id: id)
    }.compactMap { data in
        return data
    }
}

return Promise { seal in”仅在需要包装非 Promise 异步代码时才需要

关于swift3 - 在 PromiseKit 6 中正确链接多个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50928472/

相关文章:

swift - 使用未声明的类型错误 : How to compare object with class type?

ios - TableView 不显示数据,为什么? ( swift 3)

ios - PromiseKit 6 对成员 'value' 的引用在没有上下文类型的情况下无法解析

swift - 创建一个包含可执行代码的 void Promise

objective-c - NSRegularExpression 提取两个 XML 标签之间的文本

ios - 使用 AlamoFire 将图像上传到 Uploadcare.com

ios - 使用 ios 图表 swift 3 的折线图

xcode - PromiseKit段错误: 11

ios - 使用 PromiseKit 时更新 Realm 对象时出现问题

ios - PromiseKit 6 中 firSTLy 的语法