Я не уверен, как решить эту проблему с отображением ... Я думал, что ES6 всегда отображает по порядку ... но я думаю, что происходит что-то необычное? Вы можете помочь. Вот описание ... и код ..
Сначала я выбираю массив идентификаторов из Mon go DB в моей функции componentDidMount. Этот список приходит в том же порядке каждый раз. Я проверил.
Я передаю массив идентификаторов моей второй функции convertIdToCard ... Эта функция отображает массив и извлекает информацию из mongoDB из каждого идентификатора. Здесь вещи выходят из строя.
Выборка возвращает объект для каждого идентификатора, который был сопоставлен с исходным массивом. Это толкает объект в новый массив. Этот массив остается в том же порядке, что и исходный массив, примерно в 80% случаев ... и 20% массив не в том же порядке.
Я добавил setTimeout ко второй функции ... это помогает, но все еще не правильно в 100% случаев.
componentDidMount(){
fetch(`http://localhost:5000/api/autoquotegenerators/${this.state._id}`)
.then(res => res.json())
.then(res => {
this.convertIdToCard(res.quoteGenerator)
console.log(res.quoteGenerator)
});
}
convertIdToCard(quoteCards){
quoteCards.map(id => {
setTimeout(() => {
fetch(`http://localhost:5000/api/autoquotegenerators/${id}`)
.then(res => res.json())
.then(res => {
// console.log(res.quoteGenerator[0].cardType)
this.createQuoteCards(res.quoteGenerator);
console.log(res.quoteGenerator)
})
},1000)
})
}
Вот мой новый код ---
componentDidMount(){
fetch(`http://localhost:5000/api/autoquotegenerators/${this.state._id}`)
.then(res => res.json())
.then(res => {
this.convertIdToCard(res.quoteGenerator)
console.log(res.quoteGenerator)
});
}
convertIdToCard(quoteCards){
const selfMap = (quoteCards) => {
if(quoteCards.length > 0){
fetch(`http://localhost:5000/api/autoquotegenerators/${quoteCards.shift()}`)
.then(res => res.json())
.then(res => {
// console.log(res.quoteGenerator[0].cardType)
this.createQuoteCards(res.quoteGenerator);
console.log(res.quoteGenerator)
selfMap(quoteCards);
})
}else {
console.log('done')
}
}
selfMap(quoteCards);
}