gpt4 book ai didi

swift - 使用 Vapor 查询和映射

转载 作者:可可西里 更新时间:2023-11-01 01:08:21 26 4
gpt4 key购买 nike

我正在尝试使用 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回调就像你传递给 URLSession.dataTask 的闭包向 iOS 应用程序的外部 API 发出请求时。

Vapor 使用的异步模型与您在 iOS 中使用的模型略有不同,它使用 promises 和 futures 而不是回调闭包。您可以阅读有关它们的信息 in the docs .

在您的情况下,您想要返回 userID你从AccessToken得到询问。为此,您首先需要将方法的返回类型从 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值,这样您就不会强制展开它们。

关于swift - 使用 Vapor 查询和映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com