我该如何创建一个对象,其方法将其调用传递给最终将实现它们的promise?

我有一个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__一样?感谢您的指导!

hzthzjln 回答:我该如何创建一个对象,其方法将其调用传递给最终将实现它们的promise?

顶层有一个proposal支持await,那么您可以await进行配置,一切都很好。

但是到目前为止,这是不可能的。

本文链接:https://www.f2er.com/2682291.html

大家都在问