Nuxt - asyncData с несколькими запросами
В моем приложении у меня есть страница продавца, которая отображает продукты, перечисленные этим продавцом. Я использую asyncData, чтобы получить все данные, необходимые для страницы (лучше для SEO)
asyncData ({params, app, error }) {
return app.$axios.$get(`/seller/${params.username}`).then(async sellerRes => {
let [categoriesRes, reviewsRes, productsRes] = await Promise.all([
app.$axios.$get(`/categories`),
app.$axios.$get(`/seller/${params.username}/reviews`),
app.$axios.$get(`/seller/${params.username}/products`)
])
return {
seller: sellerRes.data,
metaTitle: sellerRes.data.name,
categories: categoriesRes.data,
reviewsSummary: reviewsRes.summary,
products: productsRes.data,
}
}).catch(e => {
error({ statusCode: 404, message: 'Seller not found' })
});
},
Хотя этот метод выполняет предназначенную работу, я не могу не думать, что делаю это неправильно.
При переходе на страницу дважды отображается индикатор выполнения (что странно).
Я долго искал, чтобы попытаться найти примеры нескольких запросов в asyncData, но там не так много.
Может быть, я не должен вызывать несколько запросов в asyncData?
2 ответа
На самом деле, вы можете, используя async await
, который, выглядит намного чище тоже.
<template>
<div class="container">
<h1>Request 1:</h1>
<h1>{{ post.title }}</h1>
<pre>{{ post.body }}</pre>
<br />
<h1>Request 2:</h1>
<h1>{{ todos.title }}</h1>
<pre>{{ todos.completed }}</pre>
</div>
</template>
<script>
import axios from "axios";
export default {
async asyncData({ params }) {
// We can use async/await ES6 feature
const posts = await axios.get(
`https://jsonplaceholder.typicode.com/posts/${params.id}`
);
const todos = await axios.get(
`https://jsonplaceholder.typicode.com/todos/${params.id}`
);
return { post: posts.data, todos: todos.data };
},
head() {
return {
title: this.post.title
};
}
};
</script>
Вот рабочая песочница. (не забудьте добавить значение для :id
маршрутный парам)
Попробуйте использовать async await, вот как вы можете запускать оба запроса параллельно:
async asyncData ({ $axios }) {
const [categoriesRes, articlesRes] = await Promise.all([
$axios.get('/fetch/categories'),
$axios.get('/fetch/articles'),
])
return {
categories: categoriesRes.data,
articles: articlesRes.data,
}
},
Может быть и так?
asyncData ({params, app, error }) {
return app.$axios.$get(`/seller/${params.username}`).then(sellerRes => {
return Promise.all([
app.$axios.$get(`/categories`),
app.$axios.$get(`/seller/${params.username}/reviews`),
app.$axios.$get(`/seller/${params.username}/products`)
]).then((categoriesRes, reviewsRes, productsRes) => {
return {
seller: sellerRes.data,
metaTitle: sellerRes.data.name,
categories: categoriesRes.data,
reviewsSummary: reviewsRes.summary,
products: productsRes.data,
}
})
}).catch(e => {
error({ statusCode: 404, message: 'Seller not found' })
});
},
Это цепочка обещаний. Первое обещание пытается получить информацию о продавце. Если запрос выполнен успешно, то создается новый запрос, который будет ожидать остальную информацию.
метод asyncData
дождемся выполнения всех обещаний и вернем результат звонка.