Просто целую вечность искал этот ответ и, наконец, нашел это простое, ясное объяснение! Благодарю. Не могу поверить, что больше людей не имеют этот вопрос!

ользую axios, чтобы проверить, не был ли псевдоним другим пользователем в базе данных.

проблема: Ajax-вызов не ожидает ответа сервера для выполнения оставшегося кода.

Код выглядит так:

export default {
    data () {
        return {
            id: null,
            alias: null,
            valid: true,
        }
    },

    methods: {
        // triggered by the save button
        save () {
            this.valid = true;
            console.log('before checking');

            this.checkUniqueness();
            // other validations here

            if (this.valid) {
                console.log('3. checked valid, can save now');
                // save now
            }
        },

        checkUniqueness () {
            axios.get('/api/unique/alias', {
                params: {
                    id: this.id,
                    alias: this.alias,
                }
            })
                .then((response) => {
                    console.log('2. server response:' + response.data.unique)
                    this.valid = response.data.unique;
                });
        },

    },
}

Консоль показывает следующий результат:
1. before checking
3. checked valid, can save now
2. server response:false

Я не могу переместить кодsave() метод в.then потому что я делаю другие проверки входных данных, такие как буквенно-цифровые символы, минимум символов ...

Я смог задержать 3-ю часть (if (this.valid) {) используя наборsetTimeout но это не лучшее решение. Что делать, если сервер занимает больше или меньше, чем определенное время ожидания ..

Вопрос Есть ли способ сделать этот вызов последовательным (1, 2, 3) вместо (1, 3, 2)?

 palaѕн21 сент. 2017 г., 17:29
Запросы синхронизации еще не реализованы и не будут реализованы в Axios, поскольку запросы синхронизации в большинстве браузеров устарели и недоступны в Node.js. Информация:github.com/mzabriskie/axios/issues/681
 Warrio21 сент. 2017 г., 17:31
Есть ли другой способ взломать эту проверку без синхронизации вызовов?

Ответы на вопрос(1)

Решение Вопроса

по крайней мере, действительно не должны) делать это синхронно, поэтому вам понадобится другой путь вперед.

Одна идея: вернуть обещание от Axios:

checkUniqueness () {
    return axios.get('/api/persons/unique/alias', {
        params: {
            id: this.id,
            alias: this.alias,
        }
    })
    .then((response) => {
        console.log('2. server response:' + response.data.unique)
        this.valid = response.data.unique;
    });
}

а затем позвонитеthen() на это вsave():

this.checkUniqueness()
.then((returnVal) => {
   // other validations here
  //  save
})
.catch(err => console.log("Axios err: ", err))

Вы могли бы даже сделать все свои проверки в одном месте, если вы вернули значение из Axios'sthen() вместо того, чтобы устанавливать флаг:

.then((response) => {
    console.log('2. server response:' + response.data.unique)
    return response.data.unique;
 });

затем в сохранении:

this.checkUniqueness()
.then((valid) => {
    if (valid) // do something
   // other validations here
   //  save
})
 Andy Brown21 янв. 2019 г., 11:11
Просто целую вечность искал этот ответ и, наконец, нашел это простое, ясное объяснение! Благодарю. Не могу поверить, что больше людей не имеют этот вопрос!

Ваш ответ на вопрос