在使用 Node.js 中的 bluebird 获得一些经验之后,我正在尝试使用 PromiseKit 首次尝试 Swift Promise。我原来使用回调进行身份验证的服务函数如下所示:
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)
}
}
}
我正在尝试重写为这样的内容:
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);
}
}
但是,我在 then 行上收到错误:
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() 解决 promise ,我将履行原始的 promise 类型。我哪里出错了?
最佳答案
我错误地假设代码可以直接发送给 Promise,有时你只需要包装一个回调:
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!)
}
}
}
关于swift - 如何使用 PromiseKit 重构快速回调以实现 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36212259/