javascript - 如何创建一个对象,其方法将调用传递给最终将实现它们的承诺?
问题描述
我有一个 Web 应用程序,我想允许将日志发送到服务器。我正在使用一个像这样初始化为单例的日志库(Elasticsearch 的 RUM 代理,尽管这里不相关)...
// logger.js
const config = {
logServerUrl: 'https://loggingserver.com',
appEnvironment: 'production',
}
const logger = initLogger(config)
export default logger
并像这样在我的网络应用程序中的其他地方使用...
// error_handling.js
import logger from 'logger'
// ...
logger.startTransaction({id: 1234, name: 'foo'})
logger.logError(someError)
logger.stopTransaction(1234)
// ... and possibly more nested stuff like
logger.metadata.add('user', 'alice')
主要是我只需要调用没有(或无趣)返回值的记录器方法。
问题是,我需要从 asynchronous 获取我的配置信息fetch
,但我希望记录器立即可供应用程序的其余部分使用,如上所示。可能我应该只向记录器导出一个承诺并像使用它一样使用它
loggerPromise.then(logger => logger.logError(someError))
,但我正在考虑这样的事情......
// logger.js
const loggerPromise = fetch('/config')
.then(response => response.json())
.then(json => initLogger(json))
const fakeLogger = {
logError: error => loggerPromise.then(logger => logger.logError(error)),
metadata: {
add: (key, value) => loggerPromise.then(logger => logger.metadata.add(key, value)),
},
//... plus all the other methods I want to use in my application, like startTransaction
}
export default fakeLogger
这样应用程序的其余部分就可以使用记录器,就好像它是在模块导出时初始化的,而不是在承诺解决之后。
我的方法“有效”,但是有很多样板可以“通过”对底层记录器的方法调用。这意味着如果库添加了新方法,我也必须在我的假记录器代理中实现它们。
我很欣赏这仅在您不关心返回值的情况下才有效。
我觉得必须有一种方法来包装一个承诺,使它看起来像它最终会解决的对象。是否有一些我缺少的语言功能或聪明的模式?可能是python之类的东西__getattr__
?感谢您的任何指点!
解决方案
有一个在顶层支持的建议,然后你可以只进行配置,一切都很好。await
await
然而直到现在这是不可能的。
推荐阅读
- python - 在 Python 中使用 requests.get 检索 API 数据时,会不断向我发回 Django 视图中完全相同的一批数据
- reactjs - 类型反应上不存在属性 x
- c# - ConnectionString 属性尚未初始化。随着使用
- node.js - 在 TSX 中访问数组的元素
- javascript - Fetch within promise,零星的反向链序
- .net-core - 使用 openiddict 设置登录页面绝对 URL 的 SSO
- python - 计算正确答案
- excel - VBA中的日期格式转换
- python-3.x - 如何使用 xlsxwriter 在数据框周围设置边框?
- oracle - Oracle分层SQL - 循环子句或看到元素的集合?