为啥axios数据存储在变量中时未定义?

Posted

技术标签:

【中文标题】为啥axios数据存储在变量中时未定义?【英文标题】:Why is Axios data undefined when stored in a variable?为什么axios数据存储在变量中时未定义? 【发布时间】:2021-11-14 23:03:09 【问题描述】:

我正在处理以下代码。这是在 Vue 应用程序上实现的,并使用了许多方法,每个方法都返回一个 Axios 承诺。我试图链接这些,所以当提交新评论时,服务器会检查电影是否已经存在。如果没有,它会创建一部新电影。然后它应该使用带有 movieId 参数的 postReview 创建一个新评论。需要 movieId 才能创建新评论。 checkMovieExists() 和 postMovie() 方法都返回一个 movieId 作为响应。

问题是当我将 x.data() 或 y.data() 记录到控制台时,movieId 显示正确。但是,如果我将 x.data 或 y.data 分配给 movieId,则它是未定义的。这意味着我不能将其用作发布电影的参数。

submit() 
      let movieId = 0;
      this.checkMovieExists(this.movie.imdb_id)
        .then((x) => 
          console.log(x.data);
          if (x.data == 404) 
            this.postMovie(this.movie.imdb_id, this.movie.original_title).then(
              (y) => 
                console.log(y.data); //Displays correctly
                movieId = y.data;
                console.log(movieId); //Displays as undefined
              
            );
           else 
            movieId = x.data;
          
        )
        .then(this.postReview(movieId));
    ,

(顺便说一句,我知道电影 id 为 404 的错误。这是我的下一个任务!)

【问题讨论】:

【参考方案1】:

我建议你远离回调地狱并使用 async/await。

async submit() 
  let movieId = 0;
  const checkMovieResponse = await this.checkMovieExists(this.movie.imdb_id);
  if (checkMovieResponse.data == 404) 
    const postMovieResponse = await this.postMovie(this.movie.imdb_id, this.movie.original_title);
    movieId = postMovieResponse.data;
  
  else 
    movieId = checkMovieResponse.data;
  
  await this.postReview(movieId);

我的解决方案应该可以解决您的问题(您的代码存在异步问题)。 您的 postMovie 回调是在您的 checkMovie 回调之后执行的(在您的 postReview 方法中导致“未定义”(通过阅读您的代码应该为 0)movieId)。 如果由于某些原因,您不能使用 async/await,这里是您的“固定”代码:

submit() 
  this.checkMovieExists(this.movie.imdb_id)
    .then((x) => 
      if (x.data == 404) 
        this.postMovie(this.movie.imdb_id, this.movie.original_title).then(
          (y) => 
            this.postReview(y.data)
          
        );
       else 
        this.postReview(x.data);
      
    );

顺便说一句,如果您的 Axios 响应中的数据是一个数字(作为您的标识符),我建议您使用 === 运算符而不是 ==。 祝你的项目好运!

【讨论】:

谢谢你——这很有帮助!我会试试看的!

以上是关于为啥axios数据存储在变量中时未定义?的主要内容,如果未能解决你的问题,请参考以下文章

在全局变量中存储 getJSON 数据,但后来说它未定义

React - Axios 正在将未定义的文件数据发送到节点服务器

字段名称存储在表中时如何改进数据加载

在内存中这些变量存储在c? [关闭]

C语言中使用变量为啥必须要初始化?

为啥我的存储过程在包含在事务块中时会抛出错误?