我正在尝试从API中获取图像数据。为此,我首先需要获取它的ID,然后使用它来获取图像。为了保持干净的代码,我正在使用一个函数来执行此操作,当我尝试将响应返回给调用该函数的组件时遇到了问题。
getNextImageData
export const getNextImageData = () => {
const apiToken = lscache.get('apiToken')
return(
axios({
method: 'get',
url: 'https://myapiurl/images/',
params: {
limit: '1',
doc_cat: ''
},
responseType: 'json'
})
.then(response => {
lscache.set('imageData', response, 30)
axios({
method: 'get',
url: 'https://myapiurl/images/' + response.data[0].id + '/',
})
.then(response => {
return(response.data)
})
})
)
}
MyClass
class MyClass extends Component {
constructor(props){
super(props);
this.state = {
image: undefined
}
}
async componentDidMount() {
const data = await getNextImageData()
this.setState({
image: data,
})
}
render() {
// something
}
}
当我将代码直接粘贴到组件中时,我从返回中什么也没收到,它可以正常工作,但是我想在函数中使用它
答案 0 :(得分:1)
我错误地嵌套了它,您没有在另一个then
中使用then
,而是在同一级别上使用它们。并且每个axios调用都遵循一个return
语句。这样做甚至不需要使用异步/等待,而使用了另一个promise
。
getNextImageData
export const getNextImageData = () => {
const apiToken = lscache.get('apiToken')
return axios({
method: 'get',
url: 'https://myapiurl/images/',
params: {
limit: '1',
doc_cat: ''
},
responseType: 'json'
})
.then(response => {
lscache.set('imageData', response, 30)
return axios({
method: 'get',
url: 'https://myapiurl/images/' + response.data[0].id + '/',
})
})
.then(response => {
return response.data
})
}
MyClass
class MyClass extends Component {
constructor(props){
super(props);
this.state = {
image: undefined
}
}
componentDidMount() {
getNextImageData()
.then(data => {
this.setState({
image: data,
})
})
}
render() {
// something
}
}
答案 1 :(得分:0)
所有数据准备就绪后,您必须设置状态。
因此您可以在上一个axios调用中设置状态。
您也可以使用callbackHandler或somethig来保持代码干净。
class MyClass extends Component {
constructor(props){
super(props);
this.state = {
image: undefined
}
}
async componentDidMount() {
const nextImageResponse = await getNextImageData()
// If your first response is success make the next call
if( nextImageResponse.hasOwnProperty('data') ){
lscache.set('imageData', response, 30)
axios({
method: 'get',
url: 'https://myapiurl/images/' + nextImageResponse.data[0].id + '/',
})
.then(response => {
if( response.hasOwnProperty('data'){
this.setState({ image: response.data, nextImage: nextImageResponse.data });
}
})
}
}
render() {
// something
}
}
答案 2 :(得分:0)
尝试一下:
export const getNextImageData = async () => {
const apiToken = lscache.get('apiToken')
const data = await axios({
method: 'get',
url: 'https://myapiurl/images/',
params: {
limit: '1',
doc_cat: ''
},
responseType: 'json'
});
const firstResponse = await data; //
// set local storage
lscache.set('imageData', firstResponse, 30)
const second = await axios({
method: 'get',
url: 'https://myapiurl/images/' + firstResponse.data[0].id + '/',
});
const thirdResponse = await second.data;
return thirdResponse;
}
它起作用了吗?