javascript - 没有从 NodeJS 中的 Promise 和函数返回一些东西
问题描述
为了编写一个漂亮干净的代码,我创建了一个函数,我正在设置诸如res.status()
或发送之类的东西res.send()
现在,总的来说,我知道,如果我们在 Javascript 中不返回任何内容,它会返回未定义。
并且可能如果我们创建一个promise并且不解决它,它会导致内存泄漏?
但是,.then()
如果我们在 .then 中不返回任何内容,类似地,如果我们调用设置类似res.status()
和发送的函数的函数,这是否相同res.send()
举个例子,这就是我正在做的
考虑这个 Api 路由和中间件
router.use(MiddlewareAuth.eventBriteAuthentication)
router.get("/user", (req, res) => {
eventBriteHelper.getEventbriteRequestedDataForAuthorizedUser("https://www.eventbriteapi.com/v3/users/me", req.session.contextToken["EventbriteAccessToken"])
.then(response => {
res.send(response.data)
})
.catch(error => {
errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)
})
})
在此处,
errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)
是这个功能吗
const errorStatusCodeAndResponseEventbriteLoggedInUser = (req, res, error) => {
//Updaing the same in firebase
if (req.user["eventbrite"] !== "warning") {
FirebaseHelper.updateDataInDb("users", req.user.email, {"eventbrite": "warning"})
.catch(error => {
throw error
})
req.user["eventbrite"] = "warning"
}
res.status(error.response.status)
res.send(error.response.data.problem)
}
这个可以吗?
最后,在我的聚会刷新令牌.then()
中,我没有返回任何东西。
const meetupRefreshToken = (req, res) => {
return helperFunctionsAxios.refreshingAccessToken("meetup", req, res)
.then(response => {
let expiryTime = authHelper.calculatingTokenExpiryTime(response.data.expires_in)
let TokenToStore = {"meetupRefreshToken": response.data.refresh_token, "meetupAccessToken": response.data.access_token, "meetup_expires_in": expiryTime }
FirebaseHelper.updateDataInDb("authentication", req.user.email, TokenToStore)
.catch(err => {throw err})
req.session.contextToken = {...req.session.contextToken, ...TokenToStore}
})
.catch(error => {
errorCodesHelper.errorStatusCodeAndResponseMeetupLoggedInUser(req, res, error)
})
}
这也行吗?如果是,那么有人可以指出不返回任何内容会导致内存泄漏的情况吗?
解决方案
并且可能如果我们创建一个 Promise 并且不解决它,它会导致内存泄漏?
只有当有人无限期地期待它解决时,才会坚持返回的承诺。
但是对于 .then() 是否相同,即如果我们在 .then 中不返回任何内容,类似地,如果我们调用设置 res.status() 之类的函数并发送 res.send() 的函数
.then()
只要 Promise 的用户不期望一个已解析的值,不从处理程序返回任何东西是完全可以的。它只是将承诺的已解决值保留为undefined
.
考虑这个 Api 路由和中间件
那很好。您正在使用.then()
并.catch()
知道异步操作何时完成,然后在任何一种情况下都发送响应。没有任何东西使用最终的承诺,所以它的解析值是什么并不重要。
这 [errorStatusCodeAndResponseEventbriteLoggedInUser 函数] 好吗?
这有点奇怪并且有一些问题。它会在某些实现中生成有关未捕获拒绝的警告。看起来你正在做某种即发即弃的调用,FirebaseHelper.updateDataInDb()
无论它成功与否,你都没有对结果做任何事情。我不清楚你为什么或你的意图是什么。如果它只是某种日志记录,那么也许我可以理解(我仍然会.then()
在它上面加上一个,而不是throw
从.catch()
没有人听的时候开始)。但是,如果这不应该是一个即发即弃的实现,那么您将继续进行而不等待操作完成。
最后,在我的聚会刷新令牌
.then()
中,我没有返回任何东西。
正如我上面所说,唯一不从.then()
处理程序返回的东西是一个问题是当有人使用返回的承诺并期待一个已解决的值时。如果调用者不期望解析值,则无需返回一个。解析的值将undefined
在 Javascript 中非常好。
这种结构:
.catch(err => {throw err})
是没有意义的。没有它,您的代码也可以正常工作。要么在处理程序中做一些有用的事情,.catch()
要么忽略它并让它渗透到调用者。
此外,在您的最后一个函数中,您不再等待FirebaseHelper.updateDataInDb()
完成,因此这本质上是一个新的、未链接的承诺链,它以“即发即弃”模式进行。它可能会为未捕获的拒绝创建警告。这通常不是一个好的做法,因为它会默默地失败,没有人会知道,也没有什么等待它。
推荐阅读
- c# - 如何使用 .Include 方法从数据库中获取多个相关属性(不同类型)?
- sql-server - Update-Database 生成的脚本有语法错误,而正常的 Update-Database 工作正常
- python - Python3.8.5(scipy.optimize.curve_fit 的问题)
- qt - 创建 QQuickWidget 时出现 std::bad_alloc 异常
- python - 将在 python 中打开的 .dat.gz 数据加载到数据框中
- javascript - 聊天中 Flatlist 的几个问题。闪烁,重新加载过于频繁等
- heroku - 由于 Postgress 存储库更改,无法部署
- xml - 如何使用 csv 文件在 XSL 中构建键值对映射?
- groovy - Groovy 3.0.8 YamlSlurper 不支持多文档 YAML 文件吗?
- r - 在 ggpairs 图中更改标签