首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nuxt - asyncData有多个请求

Nuxt - asyncData有多个请求
EN

Stack Overflow用户
提问于 2019-01-10 08:40:04
回答 3查看 12.4K关注 0票数 18

在我的应用程序中,我有一个卖家页面,其中显示了卖家列出的产品。我使用asyncData来获得页面所需的所有数据(更好的搜索引擎优化)

代码语言:javascript
复制
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' })
    });
},

虽然这种方法做了预期的工作,但我不禁认为我做错了。

当导航到页面时,nuxt进度条显示两次(这很奇怪)。

我已经搜索了一段时间,试图在asyncData中找到多个请求的示例,但没有太多。

也许我不应该在asyncData中调用多个请求?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-15 16:49:28

实际上,您可以使用async await,它看起来也干净多了。

代码语言:javascript
复制
<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>

here就是其中的一个工作沙箱。(不要忘记为:id路由参数添加值)

票数 26
EN

Stack Overflow用户

发布于 2020-01-18 03:37:32

尝试使用async await,这是你可以并行运行两个请求的方式:

代码语言:javascript
复制
async asyncData ({ $axios }) {
  const [categoriesRes, articlesRes] = await Promise.all([ 
    $axios.get('/fetch/categories'),
    $axios.get('/fetch/articles'),
  ])

  return {
    categories: categoriesRes.data,
    articles: articlesRes.data,
  }
},
票数 31
EN

Stack Overflow用户

发布于 2019-01-14 18:20:31

也许是这样吧?

代码语言:javascript
复制
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' })
    });

},

这是一连串的承诺。第一个promise尝试获取有关卖方的信息,如果请求成功,则会创建一个新请求,该请求将等待其余信息。

方法asyncData将等待所有promises完成并返回调用结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54120496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档