Я пытаюсь загрузить данные ajax при создании моего компонента, однако это, похоже, заставляет другие элементы, которые также загружаются через ajax в created()
, загружать синхронно, а не асинхронно, когда выполняется следующее, этот запрос ajax выполняется около 2 секунд, вызывая все после загружать в синхронном стиле.
Следующий компонент загружается из вызова ajax примерно за 2 секунды:
component1.vue
export default {
data: () => {
return { balance: { chips: 0, coins: 0, rewards: 0 } }
},
async created() {
this.balance = (await axios.get('/api/player/balance')).data
}
}
Этот компонент загружается из вызова ajax меньше секунды:
component2.vue
export default {
data: () => {
return { items: [] }
},
async created() {
this.items = (await axios.get('/api/items')).data
}
}
Оба должны загружаться асинхронно, однако они не загружаются, запускается /api/player/balance
, затем запускается /api/items
.
Я также пробовал использовать .then()
вот так:
export default {
data: () => {
return { balance: { chips: 0, coins: 0, rewards: 0 } }
},
created() {
axios.get('/api/player/balance').then(function (response) {
this.balance = response.data
})
}
}
Когда я оборачиваю this.balance = ...
в setTimeout
, остальные элементы загружаются нормально.
Есть ли лучший способ реализовать это, чтобы запрос ajax выполнялся синхронно?
Использование fetch
решает проблему синхронной загрузки запросов и позволяет им загружаться асинхронно.
export default {
data: () => {
return { balance: { chips: 0, coins: 0, rewards: 0 } }
},
async created() {
let response = await fetch('/api/player/balance')
this.balance = await response.json()
}
}
Есть ли способ сделать это с помощью axios
?
А без await
пробовали? Выражение await
заставляет выполнение функции async
приостанавливаться до тех пор, пока не будет выполнено обещание, что приводит к зависанию других ваших элементов до завершения вызова ajax.
РЕДАКТИРОВАТЬ
Можете ли вы попробовать это с другой попыткой?
axios.get('/api/player/balance').then((response) => {
this.balance = response.data
});
Функция обратного вызова, которую вы использовали в части then
, использует нотацию ES5, где ключевое слово this
будет привязано только к этому методу. переход на нотацию ES6 подойдет. Или вы можете поместить this
в новую переменную и работать с ней, как это
const self = this;
axios.get('/api/player/balance').then(function(response) {
self.balance = response.data
});
Хотя лучшая практика (для меня) - обновить модель в mounted()
, отличную от created()
.
Перемещение его на смонтированное устраняет проблему.
однако, если я переставлю все в смонтированный, он сделает то же самое
Странный! Я заставил его работать в created()
с этим фиктивным api jsfiddle.net/Ltyyjnry/1
Все мои вызовы ajax работают, он просто запускает их синхронно, а не асинхронно. вот что я имею в виду под hang
...
@GetOffMyLawn, могу я узнать, как вы размещаете свой компонент 1 и компонент 2? Я создал одну скрипку в своем ответе, похоже, она работает нормально.
Мой вопрос был обновлен двумя компонентами. Компонент 1 имеет вызов ajax, который занимает около 2 секунд, что вызывает загрузку компонента 2 после завершения компонента 1, но компонент 2 занимает менее 1 секунды для выполнения, поэтому он должен быть выполнен до компонента 1, однако это не ...
@GetOffMyLawn, не могу дублировать проблему, с которой вы столкнулись. Можете ли вы создать одну скрипку или отредактировать мою скрипку напрямую?
Это было бы сложно сделать, потому что у меня нет способа запустить запрос ajax, который долго загружается ...
Вы также можете проверить эту отредактированную версию со своими недавно опробованными материалами