PromiseKit 在 Promises 中包装外部闭包

Posted

技术标签:

【中文标题】PromiseKit 在 Promises 中包装外部闭包【英文标题】:PromiseKit wrapping external closure in Promises 【发布时间】:2018-10-27 23:58:02 【问题描述】:

我在 Swift 中使用了一个外部库,所以我无法控制返回语句。我的理解是,为了使用 PromiseKit,我应该将这些返回值包装在 Promise 中。这是正确的吗?

假设是这样,我的工作代码如下:

private func getChannelImage(for channel: TCHChannel, completion: @escaping (UIImage?, CAProfileError?) -> Void) 
    if let members = channel.members 
        members.members(completion:  (result, paginator) in
            if result.isSuccessful() 
                // ... do something
            
            else 
                    completion(nil, CAProfileError.UnknownError)
            
        )
    

这可能很难阅读。我正在尝试使用 PromiseKit 来简化它。首先,我想将members.members(completion: (result, paginator) 简化为可以使用firstly ... 语法调用的promise。因此,我尝试执行以下操作:

private func asPromise(members: TCHMembers) -> Promise<TCHMemberPaginator> 
    return Promise<TCHMemberPaginator>  fulfill, reject in
        members.members(completion:  (result, paginator) in
            if result.isSuccesful() 
                fulfill(paginator)
             else 
                reject()
            
        )
    

但是这种方法不起作用,我得到“无法在当前上下文中推断闭包类型”。我试图找到一个在线完成的用例的好例子,但遇到了麻烦。关于如何正确返回承诺的任何想法?

【问题讨论】:

【参考方案1】:

假设TCHMemberPaginatorTCHMembers 如下,

class TCHMemberPaginator 
class TCHMembers 
    func members(completion: (Bool, TCHMemberPaginator?) -> Void) 

这里是返回Promise的方法,

private func asPromise(members: TCHMembers) -> Promise<TCHMemberPaginator> 
    return Promise  seal in
        members.members(completion:  (result, paginator) in
            if result == true, let p = paginator 
                seal.fulfill(p)
             else 
                seal.reject(NSError())
            
        )
    

【讨论】:

我在某处发现他们删除了对完成的支持,拒绝支持密封,这是我的问题。

以上是关于PromiseKit 在 Promises 中包装外部闭包的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PromiseKit 6 中使用循环?

如何确保两个“开始”的异步任务在运行另一个任务之前完成?

在 useState 中包装一个函数

在异步/等待中包装承诺

PromiseKit O-C 指南

如何在php中包装没有空格的长文本[重复]