Async ES2017 Constructor

Каков самый современный метод, обеспечивающий завершение некоторого асинхронного кода в конструкторе класса перед его последующим использованием?

В частности, как клиентский класс API может получить токен доступа, прежде чем разрешить больше вызовов методов, как показано ниже?

class API_Client {

    constructor(...) {

        # Below should 'block' other method calls until token is assigned
        this.login().then(res => {
            this.token = res.data.token;
        });

    }

    async login() {
        return makeRequest(...) # <-- Promise which returns access token data
    }
}

const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.

Я нашел более старые ответы, но не мог понять, как решить проблему, изложенную в первом комментарии, оставленном на связанном ответе.

3 ответа

Решение

Самый современный метод до сих пор не помещает асинхронный материал в конструктор. В вашем конкретном случае это

class API_Client {
    constructor(token) {
        this.token = token;
    }
    static async createLoggedIn(…) {
        const res = await makeRequest(...) # <-- Promise which returns access token data
        return new this(res.data.token);
    }
}

const client = await API_Client.createLoggedIn(…);
client.someAuthOnlyMethod()

Вы можете хранить токен как обещание:

class API_Client {

    constructor(...) {

        # Below should 'block' other method calls until token is assigned
        this.token = this.login()
          .then(res => res.data.token)

    }

    async someAuthOnlyMethod() {
      let token = await this.token;
      //...continue
    }

    async login() {
        return makeRequest(...) # <-- Promise which returns access token data
    }
}

const client = new API_Client(...);
client.someAuthOnlyMethod() # <-- Should only happen after the `login` method completes.

Для начала вам не следует вызывать асинхронный код из конструктора. В приведенном выше случае ваша функция m akeRequest будет беспокоиться о токене входа.

В этом случае в классе также нет реальной ценности. Вам просто нужно экспортировать серию функций для выполнения вызовов API.

Другие вопросы по тегам