Swift 承诺套件和投掷
Swift Promise Kit and throws
所以我在我最新的 swift 应用程序中使用 PromiseKit 来完成大部分网络代码,以及 Alamofire。当我的 returns 不是我想要的时,我正在尝试设置我的承诺 - 代码如下所示:
`
do{
firstly({
try DoStuff.doStuff()
}).then({ response in
self.array = response
}).error { error in
throw Error.GeneralError
print(error)
}
firstly({
try DoOtherThing.otherThing()
}).then({ response in
self.stuff = response
}).error{ error in
throw TransactionError.GeneralError
print(error)
}
} catch {
let alertController = UIAlertController(title: "Network Error", message: "Network error, please try again", preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
//
}
alertController.addAction(OKAction)
self.presentViewController(alertController, animated: true) {
//
}
}
`
如果我那里没有 'throw' 语句,这段代码就可以正常工作 - 如果我只是打印错误,或者把我的警报控制器代码放在那里,就可以按预期工作。但是当我添加抛出时,我在 'error' 行上看到一个编译器红旗,上面写着 Cannot call value of non function type 'ErrorType'
有什么想法吗?谢谢
我认为您对do/catch的理解不太正确。
Do/Catch 只是一个同步操作,所以要捕获抛出错误,必须在 do 块中抛出错误。在这种情况下,您在 do 块中所做的就是设置承诺。如果达到错误条件,它将在不同的上下文中异步执行 - 在您的 do catch 块之外,因此无法被捕获。
编辑:
为了更清楚地说明为什么会出现错误,这里是 PromiseKit 中错误的方法签名:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) -> Void)
'body' 闭包未声明为抛出,因此您不能抛出以退出该上下文。要抛出,需要这样声明:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) throws -> Void)
但它不能,因为它是异步执行的。
您使用 PromiseKit 执行此操作的方式类似于:
let stuff = firstly {
try DoStuff.doStuff()
}.then { response in
self.array = response
}
let otherStuff = firstly {
try DoOtherThing.otherThing()
}.then { response in
self.stuff = response
}
when(fulfilled: stuff, otherStuff).catch { _ in
let alertController = UIAlertController(title: "Network Error", message: "Network error, please try again", preferredStyle: .alert)
let OKAction = UIAlertAction(title: "OK", style: .default) { (action) in
//
}
alertController.addAction(OKAction)
self.present(alertController, animated: true) {
//
}
}
在上面,我假设 doStuff()
和 doOtherThing()
都是会引发错误的同步函数。因此,将它们包装在承诺中没有多大意义,除非您使用结果来提供异步任务,然后使用该任务的结果。
所以我在我最新的 swift 应用程序中使用 PromiseKit 来完成大部分网络代码,以及 Alamofire。当我的 returns 不是我想要的时,我正在尝试设置我的承诺 - 代码如下所示:
`
do{
firstly({
try DoStuff.doStuff()
}).then({ response in
self.array = response
}).error { error in
throw Error.GeneralError
print(error)
}
firstly({
try DoOtherThing.otherThing()
}).then({ response in
self.stuff = response
}).error{ error in
throw TransactionError.GeneralError
print(error)
}
} catch {
let alertController = UIAlertController(title: "Network Error", message: "Network error, please try again", preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
//
}
alertController.addAction(OKAction)
self.presentViewController(alertController, animated: true) {
//
}
}
`
如果我那里没有 'throw' 语句,这段代码就可以正常工作 - 如果我只是打印错误,或者把我的警报控制器代码放在那里,就可以按预期工作。但是当我添加抛出时,我在 'error' 行上看到一个编译器红旗,上面写着 Cannot call value of non function type 'ErrorType'
有什么想法吗?谢谢
我认为您对do/catch的理解不太正确。
Do/Catch 只是一个同步操作,所以要捕获抛出错误,必须在 do 块中抛出错误。在这种情况下,您在 do 块中所做的就是设置承诺。如果达到错误条件,它将在不同的上下文中异步执行 - 在您的 do catch 块之外,因此无法被捕获。
编辑: 为了更清楚地说明为什么会出现错误,这里是 PromiseKit 中错误的方法签名:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) -> Void)
'body' 闭包未声明为抛出,因此您不能抛出以退出该上下文。要抛出,需要这样声明:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) throws -> Void)
但它不能,因为它是异步执行的。
您使用 PromiseKit 执行此操作的方式类似于:
let stuff = firstly {
try DoStuff.doStuff()
}.then { response in
self.array = response
}
let otherStuff = firstly {
try DoOtherThing.otherThing()
}.then { response in
self.stuff = response
}
when(fulfilled: stuff, otherStuff).catch { _ in
let alertController = UIAlertController(title: "Network Error", message: "Network error, please try again", preferredStyle: .alert)
let OKAction = UIAlertAction(title: "OK", style: .default) { (action) in
//
}
alertController.addAction(OKAction)
self.present(alertController, animated: true) {
//
}
}
在上面,我假设 doStuff()
和 doOtherThing()
都是会引发错误的同步函数。因此,将它们包装在承诺中没有多大意义,除非您使用结果来提供异步任务,然后使用该任务的结果。