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()との約束を結んで、私が元の約束のタイプを果たしていると考えていました。どこが間違っていますか?
コードは、あなただけのタイプのデータを欠落していた、約束に直接送信することができます。 –
コードを完全に制御できる場合は正しいです。この特定のケースでは、サードパーティのライブラリを使用しているので、私はそれらが提供するメカニズムに制約されています。コールバックはAlamofireで動作する私の唯一の選択肢だったので、それをラップし、返された約束の中に自分のコードを入れておきました。 –
PromiseKitは、1年半前にmxclと話したときにalamofireを自動的にラップするのに使用されていました。それがまだ動作するかどうかわかりません。また、あなたがあなたの解決策を必要としていることを単に指摘していただけで、間違っているとは言いませんでした。 –