#reactjs #typescript #redux #observable #thunk
Вопрос:
Я пытаюсь запустить функцию GetUserName, которая вызывается внутри наблюдаемого канала, карты, затем другой карты. Я могу вернуть одно значение, но, похоже, я не могу сопоставить переданный массив, чтобы затем отфильтровать item.name если он соответствует переданному идентификатору. Если я покажу код, возможно, его будет легче понять:
Не работает:
export const fetchDesignsData = (usersArray: [Users]) => (dispatch: Dispatch<Action>) => {
console.log(usersArray);
const DESIGNS_URL = `http://localhost:5000/designs`;
dispatch({
type: "FETCH_DATA_REQUEST",
});
const responsePromise = axios.get(DESIGNS_URL);
const response$ = from(responsePromise);
response$
.pipe(
map((response) => {
const newArray: { name: string; courses: number; wales: number; last_updated: string; by: any }[] = [];
response.data.map((item: { name: any; courses: any; wales: any; updated: any; user_id_last_update: any }) => {
return newArray.push({
name: item.name,
courses: item.courses,
wales: item.wales,
last_updated: item.updated,
by: getUserName(item.user_id_last_update, usersArray),
});
});
dispatch({
type: "FETCH_DATA_SUCCESS",
payload: newArray,
});
})
)
.subscribe();
};
const getUserName = (userNumber: number, usersArray: [Users]) => {
return () => {
usersArray.forEach((item) => {
if (item.id === userNumber) {
return item.name;
}
});
};
};
В основном usersArray выглядит так:
[{id: 1, name: "Walter Doe"},
{id: 2, name: "John Doe"}]
поэтому мне нужно сопоставить этот массив, а затем посмотреть, есть ли item.id === Номер пользователя, если да, верните item.name. Но каждый раз он просто возвращается пустым. Вероятно, потому, что он находится внутри наблюдаемого
Комментарии:
1. Вы шутите использовать array.filter вместо forEach, так как forEach не возвращает никакого значения.
Ответ №1:
Вам нужно использовать фильтр, так как там вам нужно вернуть массив, который удовлетворяет условию.
//...
const getUserName = (userNumber: number, usersArray: [Users]) => {
return () => {
usersArray.filter((item) => item.id === userNumber)
.map(item => item.name)
});
};
};
//...
Комментарии:
1. но тогда мне нужно вернуть item.name если есть совпадение
2. вернитесь с картой, чтобы получить указанные значения.
Ответ №2:
В конце концов это сработало, но это не показывает item.name значение в моем компоненте при загрузке страницы, только если я удаляюсь и возвращаюсь, что-то связано с моим эффектом использования и отправкой.
const getUserName = (userNumber: number, usersArray: [Users]) => {
return usersArray.filter((item) => item.id === userNumber).map((item) => item.name);
};