代码之家  ›  专栏  ›  技术社区  ›  Rutger Huijsmans

使用Vapor查询和映射

  •  2
  • Rutger Huijsmans  · 技术社区  · 6 年前

    // Logout user
    func logout(_ req: Request) throws -> Future<APIResponseMessage> {
        let userID = self.checkAccessToken(req: req)
    
        // Delete access token here
    
        let apiResponseMessage = APIResponseMessage()
        apiResponseMessage.message = "success"
        apiResponseMessage.userID = userID
        return apiResponseMessage.create(on: req)
    }
    
    func checkAccessToken(req: Request) -> Int {
        let bearerAuthorization = req.http.headers.bearerAuthorization
        guard let _bearerAuthorization = bearerAuthorization else {
            // Works fine
            print("no bearer incluced")
            return 0
        }
    
        let _ = AccessToken.query(on: req).filter(\.accessToken == _bearerAuthorization.token).first().map(to: Int.self) { queriedAccessToken in
            // This should be first
            print("This gets printed second")
            return queriedAccessToken!.userID!
        }
    
        // This should be second
        print("This gets printed first")
        return 0
    }
    

    有谁能告诉我如何使第二个打印语句等到第一个语句完成?

    现在它导致我的注销函数运行 userID == 0 当事情不是这样的时候

    1 回复  |  直到 6 年前
        1
  •  3
  •   Caleb Kleveter smit vashi    6 年前

    正如@nathan所说,这是由于您的代码是异步的。你的 .map URLSession.dataTask 向iOS应用程序的外部API发出请求时。

    不过,Vapor使用的异步模型与iOS中使用的稍有不同,它使用promises和futures而不是callback闭包。你可以看看他们 in the docs

    在您的情况下,您需要返回 userID 你从 AccessToken 查询。为此,首先需要将方法的返回类型从 Int Future<Int> .地图 _ ,可以通过以下方法返回:

    func checkAccessToken(req: Request) -> Future<Int> {
        let bearerAuthorization = req.http.headers.bearerAuthorization
        guard let _bearerAuthorization = bearerAuthorization else {
            return req.future(0)
        }
    
        return AccessToken.query(on: req).filter(\.accessToken == _bearerAuthorization.token).first().map(to: Int.self) { queriedAccessToken in
            return queriedAccessToken!.userID!
        }
    }
    

    queriedAccessToken 用户ID 值,这样就不会强制展开它们。