首页 > 解决方案 > 如何使用 Axios 和 Typescript 等待响应?

问题描述

我需要您的帮助来调整我的方法以等待 axios 响应。基本上,我向 WebService 发送请求,我需要等待响应以捕获返回并调用另一个方法。

我尝试在通话中使用 async/await,但我可能用错了。

class PlaylistController {
  // Metodo inicial para criacao da playlist
  public async create(req: Request, res: Response): Promise<Response> {
    let artists = req.body.bands;
    artists = artists.split(',');

    const search = await Object.values(artists)
      .map((artistsName): Promise<AxiosResponse> => this.searchArtists(artistsName));
    console.log(search);

  }

  private searchArtists = async (artistName): Promise<AxiosResponse> => axios.get(`${API_URL}/search`, {
    params: {
      q: artistName,
      type: 'artist',
    },
    headers: {
      Authorization: `${TOKEN_TYPE} ${REFRESH_TOKEN}`,
    },
  }).then((response): AxiosResponse => { console.log(response.data.artists); return response; })
    .catch((error) => { console.log(error.response.data); return error; });
}

此代码首先记录“console.log(search);”的结果 使用此输出:

[Promise { pending },
 Promise { pending },
 Promise { pending } ]

之后显示 axios 响应。

标签: javascriptnode.jstypescriptasynchronousaxios

解决方案


您的“创建”函数没有返回一个承诺,它是一个 void 返回类型的函数。此外,您需要在“ Axios ”等异步任务之前添加等待。Object.values 不是异步任务。

class PlaylistController {
    // Metodo inicial para criacao da playlist
    public create(req: Request, res: Response): void {
      let artists = req.body.bands;
      artists = artists.split(',');

      search = Object.values(artists).map((artistsName): any => this.searchArtists(artistsName));
      console.log(search)
    }

    private searchArtists = async (artistName): Promise<AxiosResponse> => {
        return await axios.get(`${API_URL}/search`, {
            params: {
              q: artistName,
              type: 'artist',
            },
            headers: {
              Authorization: `${TOKEN_TYPE} ${REFRESH_TOKEN}`,
            }
        })
    }
}

推荐阅读