簡體   English   中英

使用 Vapor 進行查詢和映射

[英]Querying and mapping using Vapor

我正在嘗試使用 Swift 和 Vapor 編寫一個函數,但我不明白為什么一個語句會在另一個語句之前打印:

// 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運行,而這不應該是這種情況

正如@nathan 所說,這是由於您的代碼是異步的。 您的.map回調就像在向 iOS 應用程序的外部 API 發出請求時傳遞給URLSession.dataTask的閉包。

Vapor 使用與您在 iOS 中使用的異步模型略有不同的異步模型,使用承諾和期貨而不是回調閉包。 您可以在文檔中閱讀有關它們的信息

在您的情況下,您希望返回從AccessToken查詢中獲得的userID 為此,您首先需要將方法的返回類型從Int更改為Future<Int> 然后,您可以從方法中返回它,而不是將.map調用的結果分配給_

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

我建議您查看對queriedAccessTokenuserID值的錯誤處理,這樣您就不會強制解包它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM