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

Javascript 我如何创建一个对象,其方法将调用传递给最终将实现它们的承诺?,javascript,logging,javascript-objects,es6-promise,Javascript,Logging,Javascript Objects,Es6 Promise,我有一个web应用程序,我想允许它将日志发送到服务器。我正在使用一个日志库(Elasticsearch的RUM代理,虽然这在这里不相关),它被初始化为这样的单例 // logger.js const config = { logServerUrl: 'https://loggingserver.com', appEnvironment: 'production', } const logger = initLogger(config) export default logge

我有一个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')
// 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
并在我的web应用程序中的其他地方使用,如

// 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')
// 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
我主要只需要调用没有(或无趣)返回值的记录器方法

问题是,我需要从异步
获取
中获取配置信息,但我希望记录器立即可供应用程序的其余部分使用,如上图所示。也许我应该向记录器导出一个承诺,并像这样使用它
loggerPromise.then(logger=>logger.logError(someError))
,但我想的是这样的

// 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')
// 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
因此,应用程序的其余部分可以使用记录器,就好像它是在模块导出时而不是在promise解析之后初始化的一样

我的方法“有效”,但是有很多锅炉板可以“传递”到底层记录器的方法调用。这意味着,如果库添加了新方法,我也必须在我的假记录器代理中实现它们

我明白,只有在不关心返回值的情况下,这才有效

我觉得必须有一种方法来包装一个承诺,使它看起来像它最终将要解决的目标。有没有比我所缺少的语言特征或聪明的模式?像python的
\uuu getattr\uuuu
之类的东西?谢谢你的指点

在顶层有一个支持
wait
的程序,然后您可以
wait
配置,一切都很好


然而,到目前为止,这是不可能的

这看起来很酷!我没有听说过这个建议。但是,在我的情况下,它会阻止使用记录器的代码,我可能不希望记录器初始化失败,从而阻止应用程序的其余部分工作。不过,值得深思。