所以我在我最新的swift应用程序中使用PromiseKit来完成大部分网络代码,以及Alamofire。当我的回报不是我想要的时候,我试图设定我的承诺,这就是代码的样子:&/ p>
`
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时,我在'错误'上得到了编译器红旗。这句话说Cannot call value of non function type 'ErrorType'
有什么想法吗?感谢
答案 0 :(得分:0)
我认为你对do / catch的理解并不是很正确。
Do / Catch只是一个同步操作,因此为了捕获throw,必须在do块中抛出错误。在这种情况下,您在do块中所做的一切就是建立承诺。如果达到错误条件,它将在不同的上下文中异步执行 - 在do catch块之外,因此无法捕获。
修改强> 为了更清楚地了解您收到错误的原因,这里是PromiseKit中错误的方法签名:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) -> Void)
'''闭包不被声明为抛出,因此你不能抛出退出该上下文。要抛出,需要像这样声明:
func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) throws -> Void)
但它不能,因为它以异步方式执行它。
答案 1 :(得分:0)
使用PromiseKit执行此操作的方式如下:
doStuff()
在上面,我假设doOtherThing()
和mysql -u root -pPASS "DB_NAME" < "SQL_FILE_NAME.sql"
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
都是引发错误的同步函数。因此,将它们包装在promises中没有多大意义,除非您使用结果来提供异步任务然后使用结果。