@EVOSandru6

Как во Vue2 с помощью axios без setTimeout() перехватить данные асинхронного запроса?

Добрый день,

Есть такая проблема. По http запросу вытаскиваю данные с сервера для первичной инициализации. Но возникает проблема во время выполнения - данные которые риходят в ответах не получается перехватить из за асинхронности таковых запросов.

Пример отражает мою проблему. Максимально упростил для понятности.

export default {

        data: function () {
            return {
                order: null,
            }
        },
        created() {

            this.initOrder();

            this.initOptions();
        },

        methods: {

            initOrder() {

                HTTP.get('/orders/id=' + this.$route.params.id).then((response) =>
                {

                    this.order = response.data;
                });
            },
            initOptions() {

                console.log(this.order); // return null

                // ...

                this.order.param = 'oops'; // exception cannot read property of null

                // ...

                setTimeout(() => {

                    console.log(this.order); // return expected object

                    this.order.param = 'oops'; // so good by setTimeout is cumbersome

                }, 1000);
            }
        },
    }

}


Интересует - как можно решить данную проблему в крайнем случаем убийством ассинхронности или еще как то по человечески.
  • Вопрос задан
  • 393 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
Нужно сделать так
data: function () {
            return {
                order: {
                  param: 'default state'
                },
            }
        },

и не будет никаких exception. Т.е. для всех параметров следует описывать структуру заранее.

Плюс к тому, по-хорошему, асинхронные методы должны бы возвращать промис
initOrder() {
  return HTTP.get('/orders/id=' + this.$route.params.id)
    .then((response) => {
      this.loaded = true;
      this.order = response.data;
    });
},

Теперь мы всегда можем повесить какое-то действие на резолв initOrder через then, например вызвать initOptions.
this.initOrder().then(this.initOptions);
А на основной компонент по флагу this.loaded можно показывать какую-нибудь крутилку, пока данные не загружены.
Промис так же можно вернуть, сделав, async initOrder() ну и переписав его как асинк-функцию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы