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函数包装在resolver
和do
调用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)
}
}
}
答案 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供您参考。