redux-saga takeПоследние запросы на отмену ожидающих - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть рабочий 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"))
    }
}
...