Swift Promise Kit和throws

时间:2016-06-18 17:53:29

标签: swift promisekit

所以我在我最新的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'有什么想法吗?感谢

2 个答案:

答案 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中没有多大意义,除非您使用结果来提供异步任务然后使用结果。