Как я могу создать объект, чьи методы передают свои вызовы обещанию, которое в итоге выполнит их? - PullRequest
0 голосов
/ 30 января 2020

У меня есть веб-приложение, которое я хочу разрешить отправлять журналы на сервер. Я использую библиотеку журналов (агент RUM от Elasticsearch, хотя здесь это не актуально), которая инициализируется как синглтон, подобный этому ...

// 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')

В основном мне просто нужно вызвать методы регистратора, которые не имеют (или неинтересны) возвращаемых значений.

Проблема в том, что мне нужно получить информацию о конфигурации из асинхронного 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__? Спасибо за любые указатели!

1 Ответ

0 голосов
/ 30 января 2020

Существует предложение для поддержки await на верхнем уровне, тогда вы можете просто await конфигурировать и все в порядке.

Однако до сих пор это было невозможно ,

...