React Native - установить порядок для двух функций
Я новичок в React Native, поэтому заранее прошу прощения.
У меня есть функция с именем setAllComments(), которая вызывается из componentDidMount.
Эта функция выполняет функцию AsyncStorage.setItem (), и я хочу, чтобы эта функция была завершена до вызова другой функции - getComments(),
(Это делает AsyncStorage.getItem ()).
Проблема в том, что функция getComments() выполняется до завершения функции setAllComments().
Я пытался решить эту проблему с помощью функции обратного вызова, но это застряло в моем приложении.
Кто-нибудь знает, как установить порядок для этих двух функций?
async componentDidMount() {
this.setAllComments();
}
setAllComments = () => {
console.log("setAllComments function!");
fetch(URL + "/CommentsList2", {
body: null,
method: "POST",
headers: {
Accept: "application/json",
"Content-type": "application/json; charset=UTF-8"
}
})
.then(res => {
return res.json();
})
.then(commentsResult => {
console.log("function setAllComments - before comments parse");
AsyncStorage.setItem("@Project:comments", commentsResult.d);
console.log("finished setItem");
})
.catch(err => {
console.error(err);
})
.then(this.getComments());
};
async getComments() {
console.log("entered getCommens");
await AsyncStorage.getItem("@Project:comments").then(value => {
let commentsList = JSON.parse(value);
this.setState({ comments: commentsList });
console.log(this.state.comments, "getComments - Player with comments");
});
}
2 ответа
У вас есть несколько проблем с вашим подходом.
Первый. AsyncStorage
хорошо асинхронно
AsyncStorage.setItem("@Project:comments", commentsResult.d);
console.log("finished setItem"); // not true
Вы должны вернуть обещание, чтобы сохранить цепочку обещаний
.then(commentsResult => {
console.log("function setAllComments - before comments parse");
return AsyncStorage.setItem("@Project:comments", commentsResult.d);
})
.then(() => console.log("finished setItem");) // now it is more likely :)
затем .then(this.getComments());
Вы немедленно вызываете функцию должна быть
.then(() => this.getComments());
И наконец setState
также асинхронный (но он не возвращает обещание). Так что вам нужно пройти обратный звонок.
this.setState(
{ comments: commentsList },
() => console.log(this.state.comments, "getComments - Player with comments")
);
Также вы смешиваете async/await
с кучей then/catch
придерживайтесь одного подхода через ваш код (по крайней мере, внутри функции:))
Будучи новичком, вы отлично справляетесь с использованием asyn, но асинхронность не должна работать. У async есть отличная функция или "слово" для работы, она называется "ожидание", именно то, что вы хотите. Он ожидает асинхронную функцию и нет необходимости использовать ".then()"
Ваша функция с асинхронным должна быть похожа
async componentDidMount() {
await this.setAllComments();
await this.getComments()
}
setAllComments = async () => {
//console.log("setAllComments function!");
var fetchresult = await fetch(URL + "/CommentsList2", {
body: null,
method: "POST",
headers: {
Accept: "application/json",
"Content-type": "application/json; charset=UTF-8"
}
})
fetchresult = await fetchresult.json()
//console.log("function setAllComments - before comments parse");
await AsyncStorage.setItem("@Project:comments", fetchresult.d).catch(err => {
console.error(err);
})
//console.log("finished setItem")
};
async getComments() {
//console.log("entered getCommens");
let commentsList = await AsyncStorage.getItem("@Project:comments")
commentsList = JSON.parse(Comments)
this.setState({ comments: commentsList });
//console.log(this.state.comments, "getComments - Player with comments");
});
}