2016-03-25 24 views
0

ノードにブルーバードを使用した経験をして、PromiseKitを使用して初めての約束事を試みています。コールバックでの認証のための私の元のサービス機能は、次のようになります。PromiseKitで約束する迅速なコールバックをリファクタリングする方法

private func requestNewTokenPromise(email : String, password: 
String) -> Promise<UserLoginData?>{   
return Promise{ fulfill, reject in    
    Alamofire.request(Router.Authenticate(email,password).URLRequest) 
     .responseJSON { request, response, result in 
      switch result { 
      case .Success(let data): 
       let jsonData = JSON(data) 
       fulfill(jsonData) 
      case .Failure(_, let error): 
       print("Request failed with error: \(error)") 
       reject(error) 
      } 
     } 
}.then { json in 

      let success = json["success"].bool! 
      let message = json["message"].string! 

      if(success) { 
       let token = json["token"].string 
       let userId = json["_id"].string 

       self.deleteSavedUser() 
       self.saveUserToCoreData(email, password: password, token: token!, userId: userId!) //sets the class's savedUser property 

       return Promise(self.savedUser); 
      } 

      return Promise(nil);    
} 
} 

しかし、私はその後、ライン上のエラーを取得:

private func requestNewToken(email : String, password: String, 
completion: (success: Bool, token: String?, userId : String?, message: String?) -> Void) { 

Alamofire.request(Router.Authenticate(email, password).URLRequest) 
    .responseJSON { request, response, result in 
     switch result { 
     case .Success(let data): 
      let jsonData = JSON(data) 

      let success = jsonData["success"].bool! 
      let message = jsonData["message"].string! 

      if(success) { 
       let token = jsonData["token"].string 
       let userId = jsonData["_id"].string 

       self.deleteSavedUser() 
       self.saveUserToCoreData(email, password: password, token: token!, userId: userId!) 
       completion(success: true, token: token, userId: userId, message: message) 
       return 
      } 

      completion(success: false, token: nil, userId: nil, message: message) 
      print("Token request failed with error: \(message)") 

     case .Failure(_, let error): 
      print("Request failed with error: \(error)") 
      completion(success: false, token: nil, userId : nil, message: nil) 
     } 
} 
} 

私はこのようなものに書き換えしようとしています

AuthenticationService.swift:147:6: Cannot convert return expression of type 'Promise<AnyObject?>' 
(aka 'Promise Optional<AnyObject>> ') to return type 'Promise<UserLoginData?>' (aka 'Promise<Optional<UserLoginData>>') 

私はPromise()との約束を結んで、私が元の約束のタイプを果たしていると考えていました。どこが間違っていますか?

答えて

0

私は、コードを仮定で間違っていた約束に直接送信することができ、時にはあなただけのコールバックをラップする必要があります。

public func login(email: String, password: String) -> Promise<UserLoginData> { 
     return Promise { fulfill, reject in 
      requestNewToken(email, password: password){ 
       success, returnToken, userId, message in 

       if(!success){ 
        reject(LoginError.LoginFailed(message)) 
        return 
       } 
       self.deleteSavedUser() 
       self.saveUserToCoreData(email, password: password, token: returnToken!, userId: userId!) 
       let user = self.fetchUserFromCoreData() 
       fulfill(user!) 
      } 
     } 
    } 
+0

コードは、あなただけのタイプのデータを欠落していた、約束に直接送信することができます。 –

+0

コードを完全に制御できる場合は正しいです。この特定のケースでは、サードパーティのライブラリを使用しているので、私はそれらが提供するメカニズムに制約されています。コールバックはAlamofireで動作する私の唯一の選択肢だったので、それをラップし、返された約束の中に自分のコードを入れておきました。 –

+0

PromiseKitは、1年半前にmxclと話したときにalamofireを自動的にラップするのに使用されていました。それがまだ動作するかどうかわかりません。また、あなたがあなたの解決策を必要としていることを単に指摘していただけで、間違っているとは言いませんでした。 –

関連する問題