我有一个Web应用程序,希望允许将日志发送到服务器。我使用的日志记录库(Elasticsearch的RUM代理,尽管在这里不相关)被初始化为这样的单例...
// logger.js
const config = {
logServerUrl: 'https://loggingserver.com',appEnvironment: 'production',}
const logger = initLogger(config)
export default logger
并在我的Web应用程序的其他地方使用过...
// 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')
主要我只需要调用没有(或没有兴趣的)返回值的记录器方法。
问题是,我需要从异步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
,以便应用程序的其余部分可以像在模块导出时(而不是在承诺解决之后)初始化一样使用记录器。
我的方法“有效”,但是有很多样板可以将方法调用“传递”给基础记录器。这意味着如果该库添加了新方法,我也必须在我的伪造的logger代理中实现它们。
我感谢您仅在不关心返回值的情况下使用此方法。
我觉得必须有一种包装诺言的方式,使它看起来像最终将要解决的对象。有没有比我所缺少的语言功能或聪明的模式?像python的__getattr__
一样?感谢您的指导!