【问题标题】:Correctly chain multiple promises in PromiseKit 6在 PromiseKit 6 中正确链接多个 Promise
【发布时间】:2018-06-19 12:28:33
【问题描述】:

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

我无法弄清楚如何正确链接承诺。以下是我到目前为止的想法,但我不确定创建一个新的承诺是否是一个好主意。 任何反馈表示赞赏。 谢谢:)

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)
            }
    }
}

【问题讨论】:

    标签: swift3 promisekit


    【解决方案1】:

    你没有在“恢复”中处理错误,这是一个奇怪的模式,无论如何最好不要像你那样包装承诺,而是像这样更“垂直”地链接:

    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" 仅在需要包装非承诺异步代码时才需要

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2023-03-26
      • 1970-01-01
      • 2016-09-11
      • 2016-11-21
      • 2022-06-22
      • 2016-07-26
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多