Обещание с setTimeout - PullRequest
       30

Обещание с setTimeout

0 голосов
/ 09 октября 2019

Я хочу переписать эту функцию, чтобы разрешить обещание, а не вызывать функцию обратного вызова в попытке лучше понять работу с обещаниями.

export const connect = (callback: CallableFunction|void): void => {
    LOG.debug("Connecting to DB at %s", URI);

    connectToMongoDb(URI, opts)
        .then((result) => {
            LOG.debug("Connection established");
            connection = result;

            if (callback) {
                callback();
            }
        })
        .catch((err) => {
            LOG.error("Could not establish connection to %s, retrying...", URI);
            LOG.error(err);
            setTimeout(() => connect(callback), 5000);
        });
};

Однако, похоже, я не могу. Я уже попробовал наивный подход:

export const connect = (): Promise<void> => new Promise((resolve): void => {
    // ...´
        .then((result) => {
            LOG.debug("Connection established");
            connection = result;
            resolve();
        })
    // ...
});

Но это не решает проблему при установлении соединения.

Что я делаю не так? Как я могу переписать это, чтобы правильно использовать и разрешить Обещание вместо использования функции обратного вызова?

1 Ответ

1 голос
/ 10 октября 2019

Согласно комментариям, я смог реорганизовать функцию для правильного возврата обещаний, которые разрешаются только после установления соединения:

const delay = (ms: number): Promise<void> =>
    new Promise((resolve): void => {
        setTimeout(resolve, ms);
    });

export const connect = (): Promise<void> => {
    LOG.info("Connecting to DB at %s", URI);

    return connectToMongoDb(URI, opts)
        .then((result) => {
            LOG.info("Connection to DB established");
            connection = result;
        })
        .catch((err) => {
            LOG.error("Could not establish connection to %s, retrying...", URI);
            LOG.error(err);
            return delay(5000).then(connect);
        });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...