[英]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!
}
}
我建議您查看對queriedAccessToken
和userID
值的錯誤處理,這樣您就不會強制解包它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.