自动完成时如何记录最后一个搜索请求?
how to log the last search request when autocomplete is in place?
例如,当用户键入 android
时。
一个客户端向服务器发送多个请求
即
a
an
and
等等。
我只想在服务器中记录 android
搜索请求。
我该怎么做?
我正在考虑以下策略,但不知道是否有更好的策略。
- 像以前一样进行自动完成
- 如果在用户按下键盘后
1 sec
已经过去,则发送特殊 log this search request
如果我要实现上面的内容,将如何使用 redux-saga
来实现?
您需要在一堆 takeLatest
效果中实施 debounce。因此,如果您的组件分派 INPUT_CHANGED
操作,那么您的 saga 将如下所示:
import { call, takeLatest, delay } from 'redux-saga/effects'
function* handleLog(action) {
// debounce by 1 sec
yield delay(1000);
if (action.payload.LOG_THIS_SEARCH_REQUEST) {
const apiResult = yield api.log(action.payload.value);
... // logic after api call is done
}
}
function* watchInput() {
// log latest input change
yield takeLatest('INPUT_CHANGED', handleLog);
}
因此,在提供的示例中,如果用户在 1 秒内触发了新的输入更改(即再添加一个字母),那么 saga 将只处理最新的一个。
例如,当用户键入 android
时。
一个客户端向服务器发送多个请求
即
a
an
and
等等。
我只想在服务器中记录 android
搜索请求。
我该怎么做?
我正在考虑以下策略,但不知道是否有更好的策略。
- 像以前一样进行自动完成
- 如果在用户按下键盘后
1 sec
已经过去,则发送特殊log this search request
如果我要实现上面的内容,将如何使用 redux-saga
来实现?
您需要在一堆 takeLatest
效果中实施 debounce。因此,如果您的组件分派 INPUT_CHANGED
操作,那么您的 saga 将如下所示:
import { call, takeLatest, delay } from 'redux-saga/effects'
function* handleLog(action) {
// debounce by 1 sec
yield delay(1000);
if (action.payload.LOG_THIS_SEARCH_REQUEST) {
const apiResult = yield api.log(action.payload.value);
... // logic after api call is done
}
}
function* watchInput() {
// log latest input change
yield takeLatest('INPUT_CHANGED', handleLog);
}
因此,在提供的示例中,如果用户在 1 秒内触发了新的输入更改(即再添加一个字母),那么 saga 将只处理最新的一个。