如何使用PromiseKit重构快速回调以答应 [英] How to refactor swift callback to promise with PromiseKit

查看:174
本文介绍了如何使用PromiseKit重构快速回调以答应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过一些在node上使用bluebird的经验之后,我正在尝试用PromiseKit迅速实现诺言.我用于回调身份验证的原始服务函数如下所示:

I am attempting my first foray into swift promises with PromiseKit, after some experience with doing them with bluebird in node. My original service function for authentication with a callback looks like this:

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

我正在尝试重写为这样的内容:

I'm attempting to rewrite to something like this:

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);            
 }  
}

但是,我的那一行却出现错误:

However, I get an error on my then line:

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()解决诺言,我会实现原始的诺言类型.我要去哪里错了?

I had thought by resolving the promise with Promise() that I'd be fulfilling the original promise type. Where am I going wrong?

推荐答案

我认为代码可以直接发送给promises是错误的,有时您只需要包装一个回调即可:

I was incorrect in assuming code can be sent straight to promises, sometimes you just need to wrap a callback:

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!)
            }
        }
    }

这篇关于如何使用PromiseKit重构快速回调以答应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆