Debounce react-select graphql 查询
Debounce react-select graphql query
我正在尝试消除由我的 react-select 组件发送的 graphql 查询。我正在使用 wonka 而不是 rxjs,但是没有 wonka 的标签。
const GraphqlQueryAsync = (query, outputFn) => (value) => {
console.log({ value });
return pipe(
fromValue(value),
// debounce(() => 5000),
mergeMap((input) => client.executeQuery(createRequest(query, { input }))),
map(outputFn),
take(1),
toPromise,
);
};
React-select 有一个调用我的 graphql 查询的 loadOptions 函数。
<AsyncSelect
defaultValue={value}
styles={selectStyles(error)}
placeholder={title}
onChange={onChangeSelect(onChange, name, lefts)}
defaultOptions
loadOptions={GraphqlQueryAsync(query, outputFn)}
/>
我的功能有效。但是对于 debounce
,它会等待 5 秒并且仍然会发送每个值更改。 (即,如果我键入 "rent",它会搜索 "r"、"re"、"ren" 和 "rent")。我相信这是因为 react-select 重复调用 loadOptions
函数,创建多个 Graphql 查询。无论如何,是否允许 loadOptions 继续将新值传递给带有去抖动的 GraphqlQueryAsync
函数(即仅发送 "rent" 搜索词)?
以下是如何使用 1000
毫秒的延迟对函数进行去抖:
let timerId = null
const loadOptionsDebounced = (query, outputFn) => {
clearTimeout(timerId)
timerId = setTimeout(() => {
GraphqlQueryAsync(query, outputFn)
}, 1000)
}
并且在您的 select 组件中:
<AsyncSelect
loadOptions={loadOptionsDebounced(query, outputFn)}
</AsyncSelect>
我能够使用 loadOptions 的回调功能解决。
let _GraphqlQueryDebounce;
const GraphqlQueryAsync = (query, outputFn) => (value, callback) => {
console.log({ value });
if(_GraphqlQueryDebounce) clearTimeout(_GraphqlQueryDebounce);
_GraphqlQueryDebounce = setTimeout(async () => callback(
await pipe(
fromValue(value),
mergeMap((input) => client.executeQuery(createRequest(query, { input }))),
map(outputFn),
take(1),
toPromise,
)
), 5000);
};
我正在尝试消除由我的 react-select 组件发送的 graphql 查询。我正在使用 wonka 而不是 rxjs,但是没有 wonka 的标签。
const GraphqlQueryAsync = (query, outputFn) => (value) => {
console.log({ value });
return pipe(
fromValue(value),
// debounce(() => 5000),
mergeMap((input) => client.executeQuery(createRequest(query, { input }))),
map(outputFn),
take(1),
toPromise,
);
};
React-select 有一个调用我的 graphql 查询的 loadOptions 函数。
<AsyncSelect
defaultValue={value}
styles={selectStyles(error)}
placeholder={title}
onChange={onChangeSelect(onChange, name, lefts)}
defaultOptions
loadOptions={GraphqlQueryAsync(query, outputFn)}
/>
我的功能有效。但是对于 debounce
,它会等待 5 秒并且仍然会发送每个值更改。 (即,如果我键入 "rent",它会搜索 "r"、"re"、"ren" 和 "rent")。我相信这是因为 react-select 重复调用 loadOptions
函数,创建多个 Graphql 查询。无论如何,是否允许 loadOptions 继续将新值传递给带有去抖动的 GraphqlQueryAsync
函数(即仅发送 "rent" 搜索词)?
以下是如何使用 1000
毫秒的延迟对函数进行去抖:
let timerId = null
const loadOptionsDebounced = (query, outputFn) => {
clearTimeout(timerId)
timerId = setTimeout(() => {
GraphqlQueryAsync(query, outputFn)
}, 1000)
}
并且在您的 select 组件中:
<AsyncSelect
loadOptions={loadOptionsDebounced(query, outputFn)}
</AsyncSelect>
我能够使用 loadOptions 的回调功能解决。
let _GraphqlQueryDebounce;
const GraphqlQueryAsync = (query, outputFn) => (value, callback) => {
console.log({ value });
if(_GraphqlQueryDebounce) clearTimeout(_GraphqlQueryDebounce);
_GraphqlQueryDebounce = setTimeout(async () => callback(
await pipe(
fromValue(value),
mergeMap((input) => client.executeQuery(createRequest(query, { input }))),
map(outputFn),
take(1),
toPromise,
)
), 5000);
};