【问题标题】:Console log undefined after fetching api in Vue在Vue中获取api后控制台日志未定义
【发布时间】:2019-04-09 12:13:48
【问题描述】:

从 API 获取时(第 3 方,我在 Laravel 控制器中进行身份验证并获取数据)我在控制台中得到“未定义”。我想将数据存储在 Vue 组件中。

我尝试了很多不同的方法,包括 get 而不是 fetch,但这也记录了 undefined。我做了一些研究并阅读了箭头函数,但我没有使用箭头函数。

data() {
    return {
        tickets: [],
    };
},

created() {
    this.fetchTickets();
},

methods: {
    fetchTickets() {
        fetch('/api')
        .then(res => {
            this.tickets = res.json;
        })
        .then(res => {
            console.log(res.json);
        }) 
    }
}

所以,我想要的是由我发送到 PHP 中的第 3 方 API 的 get 请求组成的集合,该集合返回到路径 /api,存储在我的 Vue 组件中。现在它只是记录未定义。

在 PHP 中编辑后端请求

 $response = $client->get('v1/tickets/search.json', [
        'query' => ['statuses[]' => 'active', 'assignedTo[]' => 314955, 
        'sortDir' => 'desc', 'sortBy' => 'updatedAt']
    ]);

    $json = (string)$response->getBody()->getContents();
    $decoded = json_decode($json, true);
    return collect($decoded);

路线: Route::get('/api', 'ApiController@getTickets',);

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

fetch 返回一个包含响应 res 的承诺。 (这只是一个 HTTP 响应,而不是实际的 JSON。)

要从响应中提取 JSON 正文内容,我们使用 json() 方法

你可以阅读更多关于using fetch的信息。

fetchTickets() {
    fetch('/api')
    .then(res => res.json()) //returning a promise To extract the JSON body content from the response
    .then(resJson => {
        this.tickets = resJson
        console.log(resJson);
    }) 
}

【讨论】:

  • 我从 API 获得的信息现在已正确记录在控制台中!谢谢!
  • 哦,我还有一个问题,resJson 是如何定义的? .then 是否只传递 res => res.json() 的内容?
【解决方案2】:

在进行第二次承诺之前返回您的数据。

fetchTickets() {
    fetch('/api')
    .then(res => {
        this.tickets = res.json;
        return res;
    })
    .then(res => {
        console.log(res.json);
    }); 

【讨论】:

  • 由于某种原因,console.log 中仍然显示未定义
  • @ScottvanDuin 解释了答案中的逻辑。首先你需要返回 res.json() 然后你会得到 json 对象。
【解决方案3】:

在第一个promise中添加return语句

fetch('/api')
  .then(res => {
      return res.json();
   })
   .then(tickets => {
     // tickets is a local variable scoped only here
     console.log(tickets);
   }) 

【讨论】:

  • Tickets 没有在任何地方定义,这只是错误:“app.js:1792 Uncaught (in promise) ReferenceError: ticket is not defined at app.js:1792”
  • ticket 是第二个承诺范围内的局部变量,你不应该让它全局可用,因为你依赖一些异步代码来填充值
  • 但是这将如何存储在组件的 data() 中呢? (我是这个级别的 vue 和 javascript 的菜鸟)
  • data()方法的作用是什么,调用data(tickets)的时候不能直接传票吗?
  • 这样我可以挂载一个将传递给不同组件的道具,我将多次使用来自 API 的数据,所以我不想在每个组件中单独获取
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 2018-07-16
  • 2013-08-18
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多