Я разрабатываю функцию поиска пользователей в моем приложении «Реакция / редукция», используя тип реакции-начальной загрузки : http://ericgio.github.io/react-bootstrap-typeahead/
Поиск пользователей вызывает API для поиска в списке пользователей, поэтому я использую компонент AsyncTypeahead .
Поскольку я использую Redux, я храню результаты загрузки и поиска в магазине, поэтому мой код выглядит примерно так:
const { searchPeople, loading, searchResults, selectedPerson } = this.props;
<AsyncTypeahead
isLoading={loading}
options={searchResults}
labelKey="DisplayName"
clearButton
minLength={5}
onSearch={searchPeople}
onChange={handleChange}
placeholder="Search for a user..."
renderMenuItemChildren={option => (
<TypeaheadItem key={option.EmployeeID} item={option} {...this.props} />
)}
/>
onSearch={searchPeople}
вызывает действие в Redux для вызова API и сохранения результатов в "searchResults":
const searchPeople = term => async dispatch => {
dispatch({
type: REQUEST_SENT
});
const results = await dispatch(applicationActions.peopleSearch(term));
dispatch({
type: REQUEST_RECEIVED,
data: results
});
};
Моя функция "peopleSearch" хранится в другом действии, где у меня есть все функции поиска пользователей. Вот почему я отправляюсь на другое действие.
const peopleSearch = searchTerm => async () => {
const url = `https://api-personSearch.test.com/search=${searchTerm}&Output=JSONP`;
const response = await fetchJsonp(url);
const data = await response.json();
return data.slice(0, 10);
};
Все работает отлично, если я ищу пользователя, печатающего медленно. Проблема заключается в том, что если я набираю имя пользователя быстро или в нормальном темпе, несколько «REQUEST_SENT» отправляются перед вызовом «REQUEST_RECEIVED». Поэтому, глядя на Redux Dev Tools, вы видите результаты, которые выглядят так:
REQUEST_SENT
REQUEST_SENT
REQUEST_SENT
REQUEST_RECEIVED
REQUEST_RECEIVED
REQUEST_RECEIVED
То, что в итоге отправляется на интерфейс, не является результатом последнего письма, набранного пользователем.
Как правильно использовать AsyncTypeahead с Redux, чтобы результаты возвращались в том порядке, в котором они были отправлены?
Не большое решение
Одна вещь, которая в итоге сработала (хотя я думаю, что это своего рода хак) - это добавление «задержки» к AsyncTypehead. Добавление delay={1000}
prop в компонент AsyncTypeahead дает API достаточно времени для завершения вызова до того, как будет выполнен другой вызов API.
Я бы хотел найти лучшее решение, если оно возможно.