2016-06-18 2 views
0

私は最新の迅速なアプリケーションで、Alamofireと一緒にほとんどのネットワークコードを実行するためにPromiseKitを使用しています。私は私のリターンは私が望むものでない場合にスローするようにセットアップするために私の約束をしようとしている - ここでのコードは次のようになります。このコードは、ドーリーちょうど互角の作品Swift Promise Kitとスロー

`

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) { 
      // 
     } 
    } 

`

私がそこに「スロー」ステートメントを持っていない場合、エラーを印刷するか、そこにアラートコントローラコードを入れるだけで、期待どおりに動作します。しかし、私がスローを追加すると、私はエラーの行にコンパイラの赤い旗が表示されるCannot call value of non function type 'ErrorType'任意の考えですか?ありがとう

答えて

0

あなたのdo/catchの理解はかなり正しいと思います。

Do/Catchは同期操作であるため、throwをキャッチするにはdoブロック内にエラーをスローする必要があります。この場合、doブロック内でやっていることはすべて、約束を設定することです。エラー状態に達すると、別のコンテキストで非同期的に実行されます。つまり、do catchブロックの外側にあるため、キャッチできません。

EDIT: あなたはここに、エラーを取得している理由、それをより明確にするためには、PromiseKitでエラーのためのメソッドシグネチャである:

func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) -> Void) 

の体 "閉鎖はそうしたがって、あなたを投げるように宣言されていませんそのコンテキストを終了するためにスローすることはできません。スローするには、次のように宣言する必要があります。

func error(policy policy: ErrorPolicy = .AllErrorsExceptCancellation, _ body: (ErrorType) throws -> Void) 

ただし、非同期に実行するため、できません。私はdoStuff()doOtherThing()がエラーに投げる両方の同期機能があることを仮定している、上記で

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) { 
     // 
    } 
} 

:あなたはPromiseKitでこれを行うだろう

+0

以降です。ありがとう! –

0

方法は次のようになります。したがって、結果を使用して非同期タスクにフィードし、その結果を使用しない限り、約束でそれらをラップするのは大変意味がありません。