Я новичок в ReactJS и redux, так что мне никогда раньше не приходилось с этим работать. Я получаю данные из вызова API в своем проекте. Я хочу изменить данные, добавив к объекту новое свойство. Однако, поскольку код не запускается синхронно, возвращается немодифицированный массив (я предполагаю) вместо модифицированного массива.
export function loadThings() {
return dispatch => {
return dispatch({
type: 'LOAD_THINGS',
payload: {
request: {
url: API_GET_THINGS_ENDPOINT,
method: 'GET'
}
}
}).then(response => {
let things = response.payload.data;
// Retrieve all items for the loaded "things"
if(things) {
things.forEach((thing, thingIndex) => {
things[thingIndex].items = []
if (thing.hasOwnProperty('channels') && thing.channels) {
thing.channels.forEach(channel => {
if (channel.hasOwnProperty('linkedItems') && channel.linkedItems) {
channel.linkedItems.forEach(itemName => {
dispatch(loadItems(itemName)).then(
item => things[thingIndex].items.push(item) // push the items inside the "things"
)
})
}
})
}
})
}
things.forEach(data => console.log(data.items.length, data.items)) // data.items.length returns 0, data.items returns a populated array
return things // return the modified array
}).catch(error => {
//todo: handle error
return false
})
}
}
Как видите, я выполняю вызов API, который возвращает данные с именем response
. Массив заполнен всеми «вещами». Если things
существует, я хочу загрузить дополнительную информацию с именем «items». Основываясь на информации в массиве things, я выполню еще один вызов API (который выполняется путем отправки функции loadItems
), который возвращает еще один promise
. Основываясь на данных в результатах этого вызова API, я вставлю sh в свойство items
(которое является массивом) объекта things
.
Как вы можете видеть в комментариях , если я l oop через массив things
и регистрирую свойство items
, которое я только что создал, оно в основном возвращает 0 как длину, что означает, что массив things
возвращается до того, как массив things
будет изменен.
Я хотел бы знать две вещи:
- Что заставляет мой код запускаться asyn c. Это функция
dispatch(loadItems(itemName))
, поскольку она возвращает обещание? - Как я могу синхронно выполнить свой код?
Обратите внимание: эта функция loadThings()
также возвращает обещание (если вы не знакомы с redux).
Возможно, вам будет интересно узнать, что я сам пробовал исправить код
Так как я не понимаю лог c почему код запускается asyn c, я пробовал безнадежные вещи. Например, обернуть код другим Promise.all
и вернуть измененный массив в этом обещании. Я использовал метод then
этого обещания для изменения массива things
, который дал точно такой же результат. Вероятно, потому что return things
выполняется за пределами этого promise
.
Мне бы очень хотелось знать, что происходит
Edit Я добавил loadItems()
код вопроса, по запросу:
export function loadItems(itemName) {
return dispatch => {
const url = itemName ? API_GET_ITEMS_ENDPOINT + `/${itemName}` : API_GET_ITEMS_ENDPOINT;
return dispatch({
type: 'LOAD_ITEMS',
payload: {
request: {
url: url,
method: 'GET'
}
}
}).then(response => {
return response.payload.data
})
}
}