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() 都是会引发错误的同步函数。因此,将它们包装在承诺中没有多大意义,除非您使用结果来提供异步任务,然后使用该任务的结果。