Показать сообщение отдельно
  #1 (permalink)  
Старый 27.02.2024, 09:08
Интересующийся
Отправить личное сообщение для AlexandrDr Посмотреть профиль Найти все сообщения от AlexandrDr
 
Регистрация: 22.11.2018
Сообщений: 11

Помогите решить задачу
Есть следующий код:

class DummyClient {
    async connect() {
        return new Promise(resolve=>{
            setTimeout(()=>{
                console.log('connect');
                resolve()
            }
            , 2000);
        }
        )
    }

    async doSomething() {
        console.log('done something')
    }
}

class ApiWrapper {
    #client;

    async getClient() {
        if (!this.#client) {
            const client = new DummyClient();
            await client.connect();
            this.#client = client;
        }
        return this.#client;
    }

    async doSomething() {
        const client = await this.getClient();
        return client.doSomething();
    }
}

const run = async()=>{
    const api = new ApiWrapper();

    await Promise.all([api.doSomething(), api.doSomething(), api.doSomething(), api.doSomething()]);
}

run();


сейчас он выводит в консоль
connect
done something
connect
done something
connect
done something
connect
done something

Нужно чтоб было
connect
done something
done something
done something
done something

Исправлять можно только код внутри класса ApiWrapper.
Я изменяю класс вот так:

class ApiWrapper {
    #client;

    async getClient() {
        if (!this.#client) {
            this.#client = new DummyClient();
            this.#client.connect()
        }
        return this.#client
    }

    async doSomething() {
        const client = await this.getClient();
        await client.doSomething();
    }
}

но в выводе у меня нарушенный порядок
done something
done something
done something
done something
connect

Не могу понять в чем проблема, понимаю что у меня сначала исполняется синхронный код, а потом результат промиса. как исправить не понимаю пока
Ответить с цитированием