#reactjs #typescript #promise #fetch #setstate
#reactjs #typescript #обещание #выборка #setstate
Вопрос:
Я использую fetch API и promise.all для сценария, в котором я передаю массив URL-адресов, откуда я извлекаю данные. Данные, полученные из всех приведенных выше URL-адресов, должны быть установлены на объект состояния.
Допустим, у меня есть массив из 5 URL-адресов, результат, возвращаемый ими, должен быть присвоен 5 различным значениям внутри моего объекта состояния.
Использование React вместе с typescript.
Помощь будет оценена.
Это то, что я пробовал до сих пор
import * as React from 'react';
const urls = [ 'http://localhost:3001/url1',
'http://localhost:3001/url2',
'http://localhost:3001/url3',
]
interface IState {
test: [],
result: [],
returnVal: []
}
export default class App extends React.Component<{},IState> {
constructor(props:any)
{
super(props);
this.state = {
test: [],
result: [],
returnVal: []
}
checkStatus(response:any) {
if (response.ok) {
return Promise.resolve(response);
} else {
return Promise.reject(new Error(response.statusText));
}
}
parseJSON(response:any) {
return response.json();
}
setData(data:any){
Object.entries(this.state).forEach(([key], index) => {
this.setState({ [key]: data[index] })
});
}
componentDidMount()
{
Promise.all(urls.map(url =>
fetch(url)
.then(this.checkStatus)
.then(this.parseJSON)
.catch(error => console.log('There was a problem!', error))
))
.then(data => {
this.setData(data);
})
}
render() {
return(
//some rendering code
)
}
}
Необходимо установить данные, возвращаемые из promise, в переменные объекта состояния.
Ответ №1:
Promise.all(urls.map(url =>
fetch(url)
.then(this.checkStatus)
.then(this.parseJSON)
))
.then(jsons => {
var newState = {};
var index = 0;
for(var key in this.state)
newState[key] = jsons[index ];
this.setState(newState);
})
Комментарии:
1. Скажем, мое результирующее состояние не имеет этих последовательных свойств, т.Е. data1 , data2 и т.д. Я обновил объект состояния
2. @velsonjr Хорошо, посмотрите обновленный ответ, основная идея все та же.
3. Я этого не понял. На что ссылаются «данные»? Не могли бы вы дать мне весь раздел обещаний? Вы имеете в виду «json», как в «newState [key] = json [index ]; »
4. @velsonjr, да, это моя опечатка, посмотрите обновленный ответ.
5. Это была небольшая ошибка. Я исправил это. Хотя спасибо!