У меня есть рабочий LiveSearch с использованием redux-saga takeLatest.Каждый раз, когда пользователь вводит символ в поле, запускается новый вызов API.
Если пользователь удерживает клавишу нажатой, происходит автоповтор и запускается множество вызовов API.Отладчик показывает, что они ожидают и в конечном итоге завершают (200) с данными отклика.
Таким образом, AutoRepeat действительно забивает сервер.Клиент также начинает сканировать, поскольку автоматически повторяющиеся символы не отображаются до тех пор, пока пользователь не отпустит ключ.
Я хотел бы уменьшить нагрузку на клиент и сервер, вызванную автоматическим повторением.Возможны следующие варианты: -
1 redux-saga отменяет ненужные ожидающие запросы на сетевом уровне. 2 Throttles-запросы Redux-Saga 3 - некоторый тайм-аут на входе onChange / метод действия
лучший вариант и как?
Ниже мой код саги
function addressLiveSearch(strName, strNbr) { // {"addr":{"strName":"Stor"}}
const url = __API__ + '/secure/addressLookup'
let payload = {}
if (strNbr.length > 0) {
payload = { "addr": { strName, strNbr } }
} else {
payload = { "addr": { strName } }
}
return axios.post(url, payload, { headers: { 'Accept': 'application/json' } })
}
function* pickUpLiveSearchSaga({ strName, strNbr }) {
try {
const response = yield call(addressLiveSearch, strName, strNbr)
const { data } = response
yield put(Actions.pickUpLiveSearchSucceded(data))
}
catch (err) {
console.log('pickUpLiveSearchSaga catch ' + err)
if (err.response && err.response.status == "401" && err.data == undefined) { // unauthorized
yield put(Actions.logout())
}
if (err.hasOwnProperty("message")) {
yield put(Actions.pickUpLiveSearchFailed(err.message))
return
}
yield put(Actions.pickUpLiveSearchFailed("Unknown network error"))
}
}