使用闭包/解析器初始化promise时,我们可以直接抛出吗?

时间:2019-02-22 17:50:41

标签: swift promisekit

PromiseKit具有public: int QueryShowTool(Guid % rguidPersistenceSlot, System::UInt32 dwId, [Runtime::InteropServices::Out] int % pfShowTool); 的初始化程序:

Promise

有时我需要我的函数返回一个/// Initialize a new promise that can be resolved with the provided `Resolver`. public init(resolver body: (PromiseKit.Resolver<T>) throws -> Void) ,但是该函数的返回值取决于其他throwing函数。自Promise闭包引发以来,直接调用try而没有do/catch块是否有效?还是我必须将每个throwing函数包装在resolverdo调用catch中?

我宁愿直接使用seal.reject(error),因为在没有try的情况下返回最终结果更加干净。

这个问题似乎很相关,但是我希望对这些方法进行一些确认,因为在文档https://github.com/mxcl/PromiseKit/issues/799中并未提及。

这有效吗?

do/catch

或者我必须像这样使用 private func getCNContacts() -> Promise<[CNContact]> { return Promise { seal in let fullNameKeyDescriptor = CNContactFormatter.descriptorForRequiredKeys(for: .fullName) guard let keysToFetch = [fullNameKeyDescriptor, CNContactPhoneNumbersKey] as? [CNKeyDescriptor] else { throw CKPersistenceError.failedToFetch("Could not cast as [CNKeyDescriptor]") } var results: [CNContact] = [] let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) try contactStore.enumerateContacts(with: fetchRequest) { contact, _ in results.append(contact) } seal.fulfill(results) } }

do/catch

也有这种可能性,但我认为这可能会带来线程问题:

private func getCNContacts() -> Promise<[CNContact]> {
    return Promise { seal in
      let fullNameKeyDescriptor = CNContactFormatter.descriptorForRequiredKeys(for: .fullName)
      guard let keysToFetch = [fullNameKeyDescriptor, CNContactPhoneNumbersKey] as? [CNKeyDescriptor] else {
        seal.reject(CKPersistenceError.failedToFetch("Could not cast as [CNKeyDescriptor]"))
        return
      }

      do {
        var results: [CNContact] = []
        let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
        try contactStore.enumerateContacts(with: fetchRequest) { contact, _ in
          results.append(contact)
        }
        seal.fulfill(results)
      } catch {
        seal.reject(error)
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

在Promise中具有throwing函数并且不处理promise解析块内的错误是完全有效的。

但是,如果要处理错误,可以使用catch(on: flags:, policy: , _ )

这是我根据您的问题进行的小实验。

    simplePromise =  Promise { resolver in
        let string = try self.getSomeString()
        resolver.resolve(Result.fulfilled(string))
    }

    simplePromise.done { results in
        print(results)
    }.catch { error in
        print("Error occurred: \(error)")
    }

现在,如果抛出了我的方法getSomeString(),则将调用catch块内的代码,但如果解析成功,则会调用done内的代码。

您可以通过创建方法getSomeString并像这样从那里扔,来尝试一下,

enum MyError: Error {
    case sampleError
}

func getSomeString() throws -> String {
    throw MyError.sampleError
}

而且,也可以尝试不要扔东西。

因此,似乎处理抛出函数错误的常用方法是实现catch回调。

您也无法实现自我捕获,并且代码也不会崩溃。最后,throwing函数被视为sealed.reject

如果您愿意,可以看一下代码。您不必使用do { } catch处理错误,但是PromiseKit会在内部进行处理,请参考here供您参考。